本篇内容介绍了“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) :具体的装饰类,拥有对流的读操作做完成具体拓展能力。
“Java中的装饰模式是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。