背景
设计模式可以说是一种高级的编程语言,现有的凯源框架中经常用到设计模式,比如动态代理、修饰者等等。了解一些常用的设计模式能够提升自己的代码质量和阅读源代码的能力。
今天我大概阐述一下修饰者模式。
以前写过关于facade模式,请参考博客:http://www.jianshu.com/p/8122153f8a27
修饰者模式
修饰者模式想达到这样一个模式,客户端调用服务端的Shap服务,其基本代码如下:
Shape c = new Shape();
我们想象这样一个要求,服务端提供的功能越来越多但客户端调用不变,比如从多边形 -> 长方形 -> 正方形 -> 红色正方形。
通过修饰者模式我们达到了两个目的:
1.客户端的调用不变即接口不变。
2.服务端只需要添加新的代码就可以添加新的功能而不需要修改已有代码,即对修改封闭。
我们需要达到如下的调用目的:
Shape s = new RedSquare(new Square( new Retangele( new multiBorder)) );//有多少修饰者都可以
首先我们定义统一的接口:
public interface draw{
public void draw();
}
其次我们通过持有引用达到修饰效果
public class shapeDecorator implement shape()
{
Shape decorated ;
public shapedecorator(shape s)
{
decorated = s;
}
public void draw()
{
dosomethingBefore()
decorated.draw();
dosomethingAfter();
}
}
···
通过如上看出,修饰者模式本质上是通过持有引用达到修饰目的(可以dosomething),通过实现统一接口实现客户端调用透明,通过构造函数持有被修饰者的引用可以优雅的写出new A(new A1 (new A2 () ) ),级联调用的代码。
网友评论