设计模式之装饰模式

装饰模式(Decorator) :动态的给一个对象增加一些额外的功能,就新增加功能来说,装饰模式比生成子类更为灵活。
举个例子: 举个不恰当的列子,比如小明穿衣服,小明是个最基本的对象,T恤和裤子就是两个装饰
类图:
在这里插入图片描述
Component: 定义一个对象接口,可以给这些对象动态的添加功能
ConcreteComponent : 定义一个具体的对象,给这个具体的对象增加功能。假如这个具体的对象就是小明
Decoratore :装饰器抽象类,继承Component,并持有一个Component对象
ConcreteDecoratoreA :具体的装饰器类,比如给小明穿衣服,穿裤子等,用来给ConcreteComponent增加功能

代码实例:

public abstract class Component {
    public abstract void operation();
}

public class ConcreteComponent extends Component {
    @Override
    public void operation() {
        System.out.print("小明:");
    }
}
public class Decorate extends Component {
    private Component mComponent;

    public Decorate(Component component) {
        this.mComponent = component;
    }

    @Override
    public void operation() {
        if (mComponent != null) {
            mComponent.operation();
        }
    }
}
public class PantsDecorate extends Decorate {
    public PantsDecorate(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        pantsBehavior();

    }

    private void pantsBehavior() {
        System.out.print(" 裤子 ");
    }
}
public class TshirtDecorate extends Decorate {
    public TshirtDecorate(Component component) {
        super(component);
    }

    @Override
    public void operation() {
        super.operation();
        tshirtBehavior();
    }

    private void tshirtBehavior() {
        System.out.print("衣服 ");
    }
}
public class DecorateDemo {

    public static void main(String[] args) {
        ConcreteComponent xiaoMing = new ConcreteComponent();
        PantsDecorate pantsDecorate = new PantsDecorate(xiaoMing);
        TshirtDecorate tshirtDecorate = new TshirtDecorate(pantsDecorate);
        tshirtDecorate.operation();
    }

}

输出结果:小明: 裤子 衣服

总结:当系统需要新功能的时候,如果在旧的类中直接增加新的代码,则增加了类的复杂度。通过装饰模式,将这些新加入的功能放在单独的类中,并让这个类包装所要修饰的对象。当需要执行特殊的功能时,客户代码可以直接在运行是有选择的、按顺序的使用装饰器进行包装对象。比如上面例子中的给小明穿衣服,可以先穿T恤再穿裤子,也可以先穿裤子再穿T恤。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值