关于装饰器模式的代码很简单相信大家都能找到。但是看完代码还是困惑什么是装饰器模式的请往下看。
在考虑设计模式的时候我们可以先设想这个代码是多人参与,并且长时间迭代的。毕竟这是设计模式的使命。从这个角度考虑很多解决方式就有了方向。
假设有一个如上所述的项目。并且做到了依赖接口。
在我接手的时候。老大和我说某一个接口(暂时叫接口A)提供的方法需要增加新的功能。这时候我肯定不能修改原来的方法,对修改关闭。那难道我要去调用该方法的地方一个个改吗?也不合适吧。这时候想一下我有什么需要做什么呢?
我有了接口A的不同实现类的不同对象 这里申明一个对象集合collection AObjects。我要对A接口中的某个方法添加一些什么东西然后再提供给更下层的调用者。这时候需要怎么做。不能改变类型。那我只能创建一个新的实现了A的类。然后是需要能够复制AObjects对象。最好是能继承,但是很显然我们不可能用继承去做这个事。那我们只能暂时持有这个对象。那这个类就暂时长下面这样。
这里借用菜鸟的代码。
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
等于说有了这个类我们可以定义需要增强的类型。但是同时我们也注意到被包装的类,其它得方法丢失了。没办法像继承一样获取被包装对象的属性和方法。只能在包装类里面去硬编码赋值过去。或者重写的时候调用一边。
在这里我们知道装饰模式不只是加强了原来的方法。他只关注加强的方法。其它得不必要的东西都被丢掉了。而这在提供给下层程序员使用的时候。不仅仅屏蔽了细节,而且还把不必要的东西全部去掉了。
同时我们要记住。在使用装饰模式的时候,装饰什么很重要。哪些东西可以丢哪些不能丢也很重要。



