Java设计模式之装饰模式

    装饰者模式作用是针对目标方法进行增强,提供新的功能或者额外的功能,动态的扩展对象,是继承关系的一种替代方法之一,符合Java开发的开闭原则。装饰者模式和代理模式很像,可以对比帮助更好地理解学习。

    我们需要通过实现接口的方式来进行增强,因此目标必须抽象为接口。

组成:

抽象组件(Component) :定义装饰方法的规范
被装饰者(ConcreteComponent) :Component的具体实现,也就是我们要装饰的具体对象。
装饰者组件(Decorator) :持有组件(Component)对象的实例引用,该类的职责就是为了装饰具体组件对象,定义的规范。
具体装饰(ConcreteDecorator) :负责给构件对象装饰附加的功能。

定义抽象接口

public interface Train {

    void speed();
}

定义装饰者

public class Decorator implements Train {

    private Train train;

    public Decorator(Train train) {
        this.train = train;
    }

    @Override
    public void speed() {
        train.speed();
    }
}

定义具体装饰类型

第一种

public class HeXie extends Decorator {

    public HeXie(Train train) {
        //调用父类的有参构造
        super(train);
    }

    public void speedUp(){
        System.out.println("提速至300km/h,变身和谐号高铁");
    }

    @Override
    public void speed(){
        super.speed();
        speedUp();
    }

}

第二种

public class FuXing extends Decorator {

    public FuXing(Train train) {
        //调用父类的有参构造
        super(train);
    }

    public void speedUp(){
        System.out.println("提速至350km/h,变身复兴号高铁");
    }

    @Override
    public void speed(){
        super.speed();
        speedUp();
    }
}

定义被装饰者

public class PuKuai implements Train {

    @Override
    public void speed() {
        System.out.println("普通列车速度100km/h");
    }
}

测试

public class Demo {

    @Test
    public void test1(){

        PuKuai puKuai = new PuKuai();

        Decorator decorator = new HeXie(puKuai);
        decorator.speed();

        System.out.println("——————————————————————————————————————");

        Decorator decorator1 = new FuXing(new HeXie(puKuai));
        decorator1.speed();
    }
}

结果

普通列车速度100km/h
提速至300km/h,变身和谐号高铁
——————————————————————————————————————
普通列车速度100km/h
提速至300km/h,变身和谐号高铁
提速至350km/h,变身复兴号高铁

Process finished with exit code 0

你可以用一个或多个具体装饰(ConcreteDecorator)包装一个对象。 
装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。(类似代理模式) 
装饰者模式的设计原则为:对扩展开放、对修改关闭,这句话体现在我如果想扩展被装饰者类的行为,无须修改装饰者基类,只需继承装饰者基类,实现额外的一些装饰或者叫行为即可对被装饰者进行包装。所以:扩展体现在继承、修改体现在子类中,而不是具体的抽象类,这充分体现了依赖倒置原则。

Java 的I/O API就是使用Decorator实现的。

抽象组件(InputStream) :装饰者模式中的超类,它只有一个抽象方法read(),子类都需要对该方法进行处理
被装饰者(FileInputStream , ByteArrayInputStream , StringBufferInputStream) :拥有通用实现read()基本方法
装饰者组件(FilterInputStream) :定义具体装饰者的行为规范,可以做统一基础处理。
具体装饰(BufferedInputStream , DataInputStream , Base64InputStream) :具体的装饰类,拥有对流的读操作做完成具体拓展能力。

转载于:https://my.oschina.net/u/4149810/blog/3098531

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值