装饰模式
装饰模式动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加的灵活。
装饰模式的结构图
Component是一个接口,可以给对象动态的添加职责,功能。ConcreteComponent是定义了一个具体的对象。也可以给对象添加一些职责。Decorator,表示装饰类,继承了Component,从外类来扩展Conmponent类的功能,但是对于Component来说,是无需知道Decoratro的存在的,而ConcreteDecorator就是具体的装饰对象了。
装饰模式的使用
在我们日常的编码当中,可能并不会如图所示的结构。很可能是需要被装饰的对象是一个类如上图中的ConcreteComponent对象,而没有抽象的Component类或者接口,那么装饰类就可以是ConcreteComponent的子类。
例如我们有一个person类,类中有一个show方法,表示人的形象
public class Pserson{
private String name;
public Pserson(String name) {
this.name = name;
}
public void Show() {
System.out.println();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
那么我们就可以创建一个人的装饰类集成person类,并且创建一个person成员,并且重写show方法,Decorate如下:
public class Decorate extends Pserson{
private Pserson p ;
public void doDecorate(Pserson pserson) {
this.p = pserson;
}
@Override
public void Show() {
if (p!=null){
p.Show();
}
}
}
最后创建具体的装饰类,来装饰就可以了
public class TshirtDecorate extends Decorate {
@Override
public void Show() {
say();
super.Show();
}
public void say(){
System.out.println("hello");
}
}
public static void main(String[] args) {
Pserson p = new Pserson("小菜菜");
TshirtDecorate t = new TshirtDecorate();
t.doDecorate(p);
t.Show();
}
同样的道理,如果只有一个ConcreteDecorator的话就没有必要创建一个单独的Decorator类了。
因为Decorator类的作用是用来完成Compont的功能的,让接下来的包装不用考虑compont的实现。
当只有一个具体的ConcreteDecorator时,就没有必要大费周折写Decorator了。直接讲decorator和concreteDecorator的责任和成一个类就可以了。
也就是直接集成person对象,然后创建一个person成员,重写集成的person方法,改成成员调用成员的person方法。并添加新功能。
public class TshirtDecorate extends Pserson {
private Pserson p;
public TshirtDecorate(Pserson p) {
this.p = p;
}
@Override
public void Show() {
say();
p.Show();
}
public void say(){
System.out.println("hello");
}
}