装饰模式: 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
在项目当中某个功能模块有它的主要功能这个是应最先实现的目标。在它的身边围绕着还可以再添加一些功能,
那这些就是附加的功能了。这些功能可以在后面的时候进行添加。那为了可以在以后动态的为其添加附加的功能,
我们就可以用装饰模式来实现。
实现原理:可以将其主要的功能想象成是一份商店里的小礼品,最初它是没有任何修饰的,店员给它在外部加了泡沫
以防止摔坏了,然后又在外层用漂亮的彩色包状纸进行包装,又将其放入一个小箱子中存入方便运送。这是一层又一层的包装,
其实装饰模式也就可以将它想象成是一层一层的对功能模块进行的包装。
下面是一个简单的例子:
package com.lovo.component;
public interface Picture {
public void doPrint();
}
package com.lovo.component;
public class PictureImp implements Picture{
@Override
public void doPrint() {
// TODO Auto-generated method stub
System.out.println("这是一幅蒙娜丽莎的画像");
}
}
package com.lovo.decorator;
import com.lovo.component.Picture;
public class AppendFrame extends Decorator {
public void doPrint() {
super.doPrint();
this.appendFrame();
}
public void appendFrame() {
System.out.println("给蒙娜丽莎的画像装上一个精美的像框");
}
}
package com.lovo.decorator;
public class AppendMask extends AppendFrame{
public void doPrint(){
super.doPrint();
this.appendMask();
}
public void appendMask(){
System.out.println("组蒙娜丽莎的画像添加一个蒙板");
}
}
package com.lovo.decorator;
import com.lovo.component.Picture;
public class Decorator implements Picture{
private Picture picture ;
public void setPicture( Picture picture ){
this.picture = picture ;
}
public void doPrint(){
picture.doPrint();
}
}
package com.lovo.main;
import com.lovo.component.Picture;
import com.lovo.component.PictureImp;
import com.lovo.decorator.AppendFrame;
import com.lovo.decorator.AppendMask;
import com.lovo.decorator.Decorator;
public class TestMain {
public static void main(String[] args) {
PictureImp pi = new PictureImp();
AppendFrame af = new AppendFrame();
AppendMask am = new AppendMask();
af.setPicture(pi);
am.setPicture(pi);
am.doPrint();
}
}
输出为:
这是一幅蒙娜丽莎的画像
给蒙娜丽莎的画像装上一个精美的像框
组蒙娜丽莎的画像添加一个蒙板