Java 的设计模式之一装饰者模式

装饰者设计模式:如果想对已经存在的对象进行装饰,那么就定义一个类,在类中对已经有的对象进行功能的增强或添加另外的行为,这个类就叫装饰者类。被修饰的类叫被装饰者类,是已经存在有的功能。在装饰者类之间又可以互相装饰

特点:
          1.装饰类通过构造方法来接收被装饰者的对象,调用它里面的功能或行为
          2. 基于对被装饰对象的功能进行扩展,提供更强大的功能

Java中的IO流是典型的装饰者模式

下面来看一行简短的代码:

扩展一个接口,定义一个抽象的方法,这个接口实际上就是一个被装饰者类

interface Work { public void work(); }

画画类:

class Drawing implements Work { //实现接口 @Override public void work() { //必须实现接口中的方法 // TODO Auto-generated method stub System.out.println("画画"); } }

上色类:

class Colour implements Work { Work w;//在内部维护一个被装饰的类 public Colour(Work w) { this.w = w; } @Override public void work() { w.work(); System.out.println("给画上色"); } }

装裱类:

class Mounting implements Work { Work w;//在内部维护一个被装饰的类 public Mounting(Work w) { this.w = w; } @Override public void work() { w.work(); System.out.println("给画装裱"); } }

测试类:

public class Test { public static void main(String[] args) throws FileNotFoundException { Work w = new Drawing(); Colour c = new Colour(w); Mounting m = new Mounting(c); m.work(); } }

上面是一个简单的装饰者模式。

装饰者模式的设计原则:
               1.多用组合,少用继承
               继承的子类实现父类的行为,是在编译时静态决定的,而且继承的行为是相同的,但是利用装饰者之间的相互修饰(组合)
          就可以扩展出强大的功能,可以动态的进行扩展,也可以撤销
            2.对扩展开放,对修改关闭
              扩展是在继承的前提下实现,在子类中修改。扩展是在继承被装饰者类实现行为或功能,不需要修改装饰者的类,只是在此基础        上,装饰另外的功能或行为

需求:定义一个人吃面,可以加生菜,也可以加辣椒,也可以都加

EatNoodle类:

class EatNoodle { public void eat() { System.out.print("吃面"); } }

装饰者类

class SunEatNoodle1 { EatNoodle eatNd; public SunEatNoodle1(EatNoodle eatNd) { //定义构造方法来接收被装饰者的对象 this.eatNd = eatNd; } public void eat() { eatNd.eat(); System.out.println("加点香菜,感觉好吃"); } }

装饰者之间的相互修饰

class SunEatNoodle2 { //EatNoodle eatNd; SunEatNoodle1 sunEat1; public SunEatNoodle2( SunEatNoodle1 sunEat1) { //定义构造方法来接收装饰者的对象 //this.eatNd = eatNd; this.sunEat1 = sunEat1; } public void eat() { System.out.println(); //eatNd.eat(); sunEat1.eat(); System.out.println("再来点辣椒,就更好吃了"); } }

测试类:

public class Demo1 { public static void main(String[] args) { EatNoodle eatNoodle = new EatNoodle(); //eatNoodle.eat(); SunEatNoodle1 sunEat1 = new SunEatNoodle1(eatNoodle); sunEat1.eat(); SunEatNoodle2 sunEat2 = new SunEatNoodle2(sunEat1);//装饰者类之间的相互修饰 sunEat2.eat(); } }

运行结果:

Java 的设计模式之一装饰者模式

装饰者与继承的关系

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/53dc9f57563822bd6e6ba24cc2e38ebd.html