设计模式(十一)装饰者模式(Decorator)

装饰者模式Decorator

在程序开发中,有时候开发人员会使用继承来扩展对象的功能,用户的需求是多变的,也就造成了使用继承会造成代码的大范围改动,其实扩展对象的功能,采用组合比继承要好的多,当用户需要变动时,只要将对象组合发生变化就可以了,不会大范围地改动继承的代码,此时就需要使用装饰者模式。 装饰者模式的本质就是为了扩充软件的功能,但又不改变软件原本的功能。就好比装修房子一样。 Decorator设计模式的结构如下: interface | _ _ _ _ | _ _ _ _ | | myClassDecorator _ _ _ _ _ | _ _ _ _ _ | | DecoratorADecoratorB 采用装饰者模式的主要目的也是为了使两个关联类之间能够解耦,以方便添加一些新的功能。

实现原理图

装饰者模式实现原理图 如果不使用装饰者模式,每次添加一个新的功能,都需要新建一个新类来继承上一个类,从而获取父类的全部属性和方法,如果修改超类,则子类都需要做相应变化,不适合维护。而使用装饰者模式,超类是一个接口,可以达到解耦的效果。实现

假如是一个超市,它需要收银,一般情况下就是商品的扫描价格,但是有时候也会搞活动,打特价之类。所以建立一个收银类的接口Cash.java

package com.devin.decorator; /** * @author 作者 E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 上午8:53:14 * 类说明 */{(String product);}

然后实现一个具体的收银功能,CashImpl.java

package com.devin.decorator; /** * @author 作者 E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 上午8:53:55 * 类说明 */{(String product) {return 100;}}

再定义一个收银的装饰类,CashDecorator.java的代码如下:

package com.devin.decorator; /** * @author 作者 E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 上午8:54:38 * 类说明 */{private Cash cash;public CashDecorator(Cash cash){this.cash = cash;}(String product) {return cash.getCash(product);}}

增加打折的新功能,该功能继承收银的装饰类,RebateCash.java

package com.devin.decorator; /** * @author 作者 E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 上午8:58:53 * 类说明 */{public RebateCash(Cash cash) {super(cash);}(String product) {return super.getCash(product) * 0.1;}}

增加只减折扣的功能,,该功能继承收银的装饰类,BacktrackCash.java

package com.devin.decorator; /** * @author 作者 E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 上午8:58:53 * 类说明 */{public BacktrackCash(Cash cash) {super(cash);}(String product) {return super.getCash(product) -0.1;}}测试

客户端测试,既要进行折扣,又要进行减折扣:

package com.devin.decorator; /** * @author 作者 E-mail: csu.ldw@csu.edu.cn * @version 创建时间:2015年4月26日 上午9:04:59 * 类说明 */{(String[] args) {Cash cash = new CashImpl();Cash rebateCash = new BacktrackCash(new RebateCash(cash));System.out.println(“巧克力的价格是:” + rebateCash.getCash(“巧克力”));}}

测试结果:

巧克力的价格是:9.9应用

Java的I/O流 Reader Writer BufferedReader BufferedWriter BufferedInputStream BufferedOutputStream

那么前世我的目光一定一刻都没从你身上离开过吧!

设计模式(十一)装饰者模式(Decorator)

相关文章:

你感兴趣的文章:

标签云: