文章目录
- 1、装饰者模式是什么
- 2、代码实现:
1、装饰者模式是什么
装饰者模式,顾名思义,是用于装饰的一种设计模式。
我们在这个背景下来思考:
有一条小狗,我们给它穿衣服,戴围巾怎么做呢?
或许大多数新手都会用继承的方法,也就是先创建一个Dog
类,然后建Dog_Clothes
类去继承Dog
就可以让小狗穿上衣服,Dog_Clothes_Scraft
去继承Dog_Clothes
就可以让穿上衣服的小狗戴上围巾。
或许你会认为这种模式并无什么明显的弊端,但是,如果装饰多了的时候呢?比如我们再给这小狗戴上手套,戒指甚至给他上百个装饰的时候,这时就会产生大量的类从而出现类爆炸。这个例子告诉我们,继承类装饰这种方法在装饰品较多的情况下并不科学可行。那么,在装饰品不多的时候就可以使用继承装饰法吗?我们来看另一种情况,假如我们给狗戴上一枚戒指只需要Dog_Ring
类,如果戴上第二枚戒指呢?可以用Dog_Ring_Ring
去继承Dog_Ring
,也可以直接用Dog_Ring_Ring
去继承Dog
呢,这两种方法显然都不方便拓展,假如我们还需要戴三只戒指的小狗,戴四只戒指的小狗,戴五只戒指的小狗呢?都需要新建一个类,并不具有良好的可拓展性,这是因为代码间的耦合度过高。那么,是否有一种方法可以使装饰品具有良好的拓展性呢?怎么在不过度增加系统负担的同时让小狗多穿几件衣服呢?这时我们从前辈大佬的经验中可以总结出一种设计模式:装饰品模式。
2、代码实现:
装饰者模式介绍:装饰者模式中主要涉及两种类,一是装饰器类,二是组件类,为了实现代码的拓展性,符合开闭原则:
一个软件实体例如类,模块和函数应对拓展开放,对修改关闭
,我们把装饰器类和组件类抽象出两个抽象类或者接口(形容词用接口,名词用抽象类)
,且抽象装饰类应该是组件抽象类的子类。
1、组件类
package pattern.decorate;
//动物抽象类
public abstract class BaseAnimals {
abstract String show();
}
2、组件实现类
package pattern.decorate;
//猫类
public class Cats extends BaseAnimals{
@Override
String show() {
// TODO Auto-generated method stub
return "cat";
}
@Override
public String toString() {
return "cat";
}
}
ackage pattern.decorate;
//狗类
public class Dogs extends BaseAnimals{
@Override
String show() {
// TODO Auto-generated method stub
return "dog";
}
@Override
public String toString() {
return "dog";
}
}
3、装饰器抽象类
package pattern.decorate;
public abstract class BaseAnimalsDecorator extends BaseAnimals{
private BaseAnimals animals;
public BaseAnimalsDecorator(BaseAnimals animals) {
this.animals=animals;
}
@Override
String show() {
return animals.show();
};
}
4、具体装饰器类
package pattern.decorate;
public class AddClothes extends BaseAnimalsDecorator{
public AddClothes(BaseAnimals animals) {
super(animals);
// TODO Auto-generated constructor stub
}
@Override
String show() {
// TODO Auto-generated method stub
return (super.show()+"+衣服");
}
@Override
public String toString() {
return super.show();
}
}
package pattern.decorate;
public class AddScraf extends BaseAnimalsDecorator{
public AddScraf(BaseAnimals animals) {
super(animals);
// TODO Auto-generated constructor stub
}
@Override
String show() {
// TODO Auto-generated method stub
return super.show()+"+围巾";
}
}
5、测试类
package pattern.decorate;
public class DecoratePatternTest {
public static void main(String[] args) {
BaseAnimals dogs=new Dogs();
//给狗穿一件衣服
dogs=new AddClothes(dogs);
//给小狗再穿一件衣服
dogs=new AddClothes(dogs);
//给狗戴一件围巾
dogs=new AddScraf(dogs);
System.out.println(dogs.show());
}
}
结果:
类的关系图: