『怎么用』装饰者模式

消除恐惧的最好办法是直面恐惧,奥利给:)

阐述

利用继承设计子类的行为,是在编译时静态决定的,且所有的子类都会继承到这个行为。如果用组合的做法扩展对象的行为,就可以在运行时动态的进行扩展。

装饰者模式:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

OO原则:对扩展开放,对修改关闭。

原理

在这里插入图片描述

  1. Component是被装饰对象的爸爸,是个接口,定义被装饰者的行为
  2. Decorator是装饰者的爸爸,它继承了Component,保证了装饰者和被装饰者的类型一致
  3. Decorator的儿子们都持有一个Component对象的引用,用以对Compoment行为做“装饰”
实现
public interface Component {

    String DESCRIPTION = "我是component";

    default String getDescription(){
        return DESCRIPTION;
    }

    /**
     * 装饰着扩展的行为
     */
    String link();
}

public interface Decorator extends Component {

    /**
     * 装饰者覆盖这个方法添加自己的属性定义,或者说是扩展这个方法
     * @return
     */
    @Override
    String getDescription();
}

public class ConcreteComponentB implements Component {

    @Override
    public String link() {
        return "我是Component的二儿子对link的实现-->";
    }
}

public class ConcreteDecoratorB implements Decorator {

    private Component component;

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

    @Override
    public String getDescription() {
        return component.getDescription() + "-->我是包装者B的描述";
    }

    @Override
    public String link() {
        return "Decorator的二女儿对Component的link做了装饰-->" + component.link();
    }
}

测试类

public class TestDrive {
    public static void main(String[] args) {
        Component componentB = new ConcreteComponentB();
        componentB = new ConcreteDecoratorA(componentB);
        componentB = new ConcreteDecoratorB(componentB);
        System.out.println("componentB.getDescription() = " + componentB.getDescription());
        System.out.println("componentB.link() = " + componentB.link());
    }
}

输出

componentB.getDescription() = 我是component-->我是包装者A的描述-->我是包装者B的描述
componentB.link() = Decorator的二女儿对Component的link做了装饰-->
				Decorator的大女儿对Component的link做了装饰-->我是Component的二儿子对link的实现-->
总结
  • 装饰者模式用了一个名词叫“组合”,其实其灵魂是“多态”,看清楚,不是“变态” :)
  • 其实用法的思路很简单,搞一个“装饰者”接口继承“被装饰者”并且@Override想要“装饰”的方法【不是所有方法,要不然你这不是装饰是拆迁】,然后不同的装饰者实现类去对这个方法做装修。装修的前提是持有一个被装饰者的引用,只有这样,才能对被装饰者中已经实现的方法“动手动脚”【人都在你屋子里了,你还不是想干嘛就干嘛:)】
Q&A

Q:这么多Component和Decorator的实现类,岂不是生活“类爆炸”?
A:搞搞“工厂模式”嘛








PS : 西八,又是枯燥的一天 (¯﹃¯)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值