野生程序员自学之路的一点笔记心得
- 装饰者模式解决了什么问题?
通常为了扩展一个类,经常用继承的手段。但是随着需求变大,子类越来越多,导致子类非常多。
利用装饰者模式,可以把编译时期的继承转换为运行时的扩展。可以在不修改任何底层代码的情况下,给对象赋予新的职责
装饰者模式举例
我就用装潢房子来举例子,一个没被装修的房子是一个对象,但是装修之后成为了什么样子的对象是一个动态的对象,可以是一个豪华的房子,也可以是一个陋室。这个例子进行抽象。
- 房子:被装饰者
- 不同规格的瓷砖,家具等:装饰者(装饰房子)
不用在编译时期,继承出所有的房子的样式,可以在运行期间动态的造出一个指定样式的房子
装饰者模式类图
重要的几点说明:
- 装饰者和被装饰者对象有相同的超类型。
这是因为利用多态的性质,可以多层装饰(包装),可以把装饰过的对象继续当作House类型,稍后我会用装修房子的例子来实现二次装饰 - 装饰者可以在被装饰者的行为之前或者之后,再加上装饰者本身自己的行为,以达到特定的目的
- 对象可以在任何时候被装饰,所以可以在运行时动态地,不限量地用你喜欢的装饰者来装饰对象
根据上面的类图来实现一个装修房子的例子
public interface House {
public void description();
}
下面是房子的类型
public class Loushi implements House {
@Override
public void description() {
System.out.println("this is my loushi");
}
}
public class Yangfang implements House {
@Override
public void description() {
System.out.println("this is your yangfang");
}
}
这个是装饰器的抽象类
public abstract class Decorator implements House {
House decoratoredHouse;
}
public class LowDecorator extends Decorator {
House decoratoredHouse;
public LowDecorator(House decoratoredHouse) {
this.decoratoredHouse = decoratoredHouse;
}
@Override
public void description() {
decoratoredHouse.description();
System.out.println("low的装修安排上");
}
}
public class LuxuryDecorator extends Decorator {
House decoratoredHouse;
public LuxuryDecorator(House decoratoredHouse) {
this.decoratoredHouse = decoratoredHouse;
}
@Override
public void description() {
decoratoredHouse.description();
System.out.println("luxury的装修安排上");
}
}
测试代码:
public class Main {
public static void main(String[] args){
House myHouse = new LuxuryDecorator(new LowDecorator(new Loushi()));
myHouse.description();
}
}
这里就实现了二次装饰,不管装修多少次,都是House类型,通过下面这张图来形象的描述一下
刚开始是一个陋室对象,第一次装饰这个陋室,把这个陋室放进LowDecorator里面,这两个的组合也是一个House类型,所以可以继续用多态的性质来装饰,在具体的方法调用顺序上面,看自己的需求即可