一、介绍
系统为了实现动态添加功能的同时不改变原有的类结构,降低继承带来的高耦合问题,常常用装饰器模式来解决这类问题。装饰器模式通过继承或实现被装饰类,同时以聚合的方式持有被装饰类的对象,在重写或实现被装饰类的方法时候新增装饰类自己的功能,以此达到动态添加功能的效果,将装饰类抽象出来,具体实现交给子类去处理,更增加了系统的灵活性,同时也符合开闭原则。
二、UML
![](https://img.haomeiwen.com/i17127000/79e41ba83ac80b35.png)
在上面UML类图中,定义Noodles抽象类,定义make()方法,意为煮面条,具体是煮牛肉面还是羊肉面由子类BeefNoodles和MuttonNoodles去决定。面煮好后想加辣椒或者煎蛋,这个时候怎么办,定义一个装饰器抽象类Decorator,继承Noodles的同时再聚合一个Noodles对象,这样在子类Pepper和Egg中就可以往Noodles中动态添加辣椒或煎蛋了。
三、代码实例
public abstract class Noodles {
protected abstract void make();
}
public abstract class NoodlesDecorator extends Noodles{
private Noodles mNoodles;
public NoodlesDecorator(Noodles noodles) {
this.mNoodles = noodles;
}
@Override
protected void make() {
mNoodles.make();
}
protected abstract void add();
}
public class BeefNoodles extends Noodles{
@Override
protected void make() {
System.out.println("煮碗牛肉面");
}
}
public class Egg extends NoodlesDecorator{
public Egg(Noodles noodles) {
super(noodles);
}
@Override
protected void make() {
super.make();
add();
}
@Override
protected void add() {
System.out.println("加煎蛋");
}
}
这里需要注意的一点是,在具体装饰器类中实现父类中定义的方法时,要先调用定义的方法再调用自己新的方法。
调用的时候创建装饰类对象,传入被装饰类对象,然后调用定义的相关方法达到功能动态增加的效果。
四、总结
装饰器模式解决由于继承导致的系统高耦合问题,继承多了在一定程度上是不利于系统拓展的,同时动态添加功能这一特点也是继承无法实现的,继承需要在基类中提前定义好相关的功能,才能在子类中得到拓展,这样在系统每想添加新功能的时候都需要去修改基类,这违反了开闭原则,装饰器模式恰好能解决这一问题。
网友评论