消除恐惧的最好办法是直面恐惧,奥利给:)
阐述原理实现总结Q&A
阐述
利用继承设计子类的行为,是在编译时静态决定的,且所有的子类都会继承到这个行为。如果用组合的做法扩展对象的行为,就可以在运行时动态的进行扩展。
装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
OO原则:对扩展开放,对修改关闭。
原理
Component是被装饰对象的爸爸,是个接口,定义被装饰者的行为Decorator是装饰者的爸爸,它继承了Component,保证了装饰者和被装饰者的类型一致Decorator的儿子们都持有一个Component对象的引用,用以对Compoment行为做“装饰”
实现
public interface Component {
String DESCRIPTION
= "我是component";
default String
getDescription(){
return DESCRIPTION
;
}
String
link();
}
public interface Decorator extends Component {
@Override
String
getDescription();
}
public class ConcreteComponentB implements Component {
@Override
public String
link() {
return "我是Component的二儿子对link的实现-->";
}
}
public class ConcreteDecoratorB implements Decorator {
private Component component
;
public ConcreteDecoratorB(Component component
) {
this.component
= component
;
}
@Override
public String
getDescription() {
return component
.getDescription() + "-->我是包装者B的描述";
}
@Override
public String
link() {
return "Decorator的二女儿对Component的link做了装饰-->" + component
.link();
}
}
测试类
public class TestDrive {
public static void main(String
[] args
) {
Component componentB
= new ConcreteComponentB();
componentB
= new ConcreteDecoratorA(componentB
);
componentB
= new ConcreteDecoratorB(componentB
);
System
.out
.println("componentB.getDescription() = " + componentB
.getDescription());
System
.out
.println("componentB.link() = " + componentB
.link());
}
}
输出
componentB.getDescription
() = 我是component--
>我是包装者A的描述--
>我是包装者B的描述
componentB.link
() = Decorator的二女儿对Component的link做了装饰--
>
Decorator的大女儿对Component的link做了装饰--
>我是Component的二儿子对link的实现--
>
总结
装饰者模式用了一个名词叫“组合”,其实其灵魂是“多态”,看清楚,不是“变态” :)其实用法的思路很简单,搞一个“装饰者”接口继承“被装饰者”并且@Override想要“装饰”的方法【不是所有方法,要不然你这不是装饰是拆迁】,然后不同的装饰者实现类去对这个方法做装修。装修的前提是持有一个被装饰者的引用,只有这样,才能对被装饰者中已经实现的方法“动手动脚”【人都在你屋子里了,你还不是想干嘛就干嘛:)】
Q&A
Q:这么多Component和Decorator的实现类,岂不是生活“类爆炸”? A:搞搞“工厂模式”嘛
PS : 西八,又是枯燥的一天 (¯﹃¯)