装饰模式

装饰模式可以在不创造更多子类的情况下讲对象的功能加以扩展

角色

  • 抽象构建角色:一个接口或抽象类,规范准备接受附加责任的对象(即具体构建角色)
  • 具体构建角色: 具体的,可以被装饰
  • 装饰角色:持有一个抽检构建的引用,已原逻辑实现抽闲构建角色的方法。
  • 具体装饰角色:可以装饰构建角色,也可以被装饰

UML类图

735865-20180308110544738-1462517163.png

装饰角色持有构建角色引用,而且装饰角色中的方法和构建角色中的想用,实现方法使用构建角色引用对应的方法,及调用构建角色原本的实现方法
具体装饰角色在重写方法时,再增加功能。

javaIO 就是使用装饰模式。

代码示例

  • 抽象构建角色:
public interface Component {
    void doSomething();
}
  • 具体构建角色:
public class ConcreteComponent implements Component{
    @Override
    public void doSomething() {
        System.out.println("具体构建角色的功能");
    }
}
  • 装饰角色:
public class Decorator implements Component{
    private Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    @Override
    public void doSomething() {
        component.doSomething();
    }
}
  • 具体装饰角色(两个):
public class ConcreteDecorator1 extends Decorator{
    public ConcreteDecorator1(Component component) {
        super(component);
    }

    @Override
    public void doSomething() {
        super.doSomething();
        this.doAnotherThing();
    }

    private void doAnotherThing(){
        System.out.println("具体装饰角色1的功能");
    }
}
public class ConcreteDecorator2 extends Decorator {
    public ConcreteDecorator2(Component component) {
        super(component);
    }

    @Override
    public void doSomething() {
        super.doSomething();
        this.doAnotherThing();
    }

    private void doAnotherThing(){
        System.out.println("具体装饰角色2的功能");
    }
}
  • 调用:
public class Client {
    public static void main(String[] args) {
        Component component = new ConcreteComponent();

        Component component2 = new ConcreteDecorator1(component);

        Component component3 = new ConcreteDecorator2(component2);

        component3.doSomething();
    }
}

转载于:https://www.cnblogs.com/Theshy/p/8527347.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值