装饰器模式是什么?装饰器模式属于结构型模式中的一种,允许向一个现有对象添加新的功能,同时又不改变其结构,作为现有类的一个包装
举个实例吧,就像我们女朋友出门前,必须要化妆,这个过程就可以抽象成一个装饰器模式,要打底,要涂口红,要扑粉,要画眉……一大堆操作,但是你让女朋友只画眉毛,那她肯定不乐意了啊,这个时候就必须再添加修饰
interface Showable{
public void show();//定义展现行为
}
class Girl implements Showable{
@Override
public void show() {
// TODO 自动生成的方法存根
System.out.print("女孩的素颜");
}
}
class Decorator implements Showable{
Showable showable;
public Decorator(Showable showable) {//构造时注入素颜的女朋友
this.showable = showable;
}
@Override
public void show() {
// TODO 自动生成的方法存根
System.out.print("粉饰(");//化妆品粉饰
showable.show();
System.out.print(")");
}//化妆品粉饰器
}
public class decoratorDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//用装饰器包裹女孩show出来
new Decorator(new Girl()).show();
}
}
interface Showable{
public void show();
}
class Girl implements Showable{
public void show() {
// TODO 自动生成的方法存根
System.out.print("素颜女孩");
}
}
abstract class Decorator implements Showable{
protected Showable showable;
public Decorator(Showable showable) {
this.showable = showable;
}
@Override
public void show() {
// TODO 自动生成的方法存根
showable.show();
}
}
class FoundationMakeup extends Decorator{
public FoundationMakeup(Showable showable) {
super(showable);
// TODO 自动生成的构造函数存根
}
@Override
public void show() {
System.out.print("打粉底(");
showable.show();
System.out.print(")");
}
}
class Lipstick extends Decorator{
public Lipstick(Decorator showable) {
super(showable);
// TODO 自动生成的构造函数存根
}
@Override
public void show() {
System.out.print("涂口红(");
showable.show();
System.out.print(")");
}
}
public class DecoratorDemoUpdate {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//口红包裹粉底,再包裹女友
Showable madeupGirl = new Lipstick(new FoundationMakeup(new Girl()));
madeupGirl.show();
}
}
学习装饰器模式,会发现有点像java IO包里的众多流处理类
new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
但是,流处理类要比我们的例子复杂许多,但是基本思想和我们装饰器模式会有些相像,也有点想俄罗斯套娃一样,一层套一层的结构