JAVA设计模式——装饰设计模式

来源:互联网 发布:软件开发质量管理体系 编辑:程序博客网 时间:2024/06/05 08:21
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

想要对已有的对象进行功能的增强

可以定义类,将已有对象传入,基于已有的功能,提供加强功能

那么自定义的这个类就被称之为装饰类


举个简单的例子:

/** * 装饰类示例 * @author Shawn·Zhang */class Person{public void eat() {System.out.println("吃饭");}}//要求:增强吃饭方法,并且不能改变原有代码//分析:这时,我们需要定义一个类,来增强,也就是对之前Person类进行修饰//我们新建一个SuperPerson类进行装饰class SuperPerson{//装饰类private Person p;public SuperPerson(Person p) {//有参构造方法,参数为被装饰对象this.p = p;}public void superEat(){System.out.println("开胃酒");p.eat();System.out.println("餐后甜点");}}public class PersonDemo {public static void main(String[] args) {Person p = new Person();SuperPerson sp = new SuperPerson(p);sp.superEat();}}

到这里可以发现,如果我们继承Person类同样可以实现该功能,为何要用装饰设计模式呢?

这也就引入了装饰设计模式对比继承的优势了

可以看到,装饰是创建有参构造函数,通过参数的传递来实现功能的增强

而继承,则是为了增强功能而重新创建一个子类,这样会使得整个体系变得臃肿


装饰类相比继承,保持了灵活性强扩展性强等特点,并且减少类和类之间的联系,也避免体系的臃肿


下面引入一个现实生活中的案例,以便理解:

例如一辆汽车,在满足基本的功能上面,假如你需要增加某些功能,只需要增加即可,而不需要将汽车拆了重新组装,这样的例子就能很好的说明装饰设计模式的好处

/** * 包装设计模式 * 汽车 *   |--桑塔纳 *     |--倒车影像 *   |--索纳塔 *     |--自动泊车 *    * 装饰模式后 * 汽车 *   |--桑塔纳 *   |--索纳塔  *   |--倒车影像 *   |--自动泊车 * @author Shawn·Zhang * */abstract class Car{//抽象类abstract void show();}class Santana extends Car{@Overridepublic void show() {System.out.println("桑塔纳");}}class Sonata extends Car{@Overridevoid show() {System.out.println("索纳塔");}}class RadarCar{private Car car;public RadarCar(Car car) {this.car = car;}public void show(){car.show();System.out.println("具有倒车影像功能");}}public class MyCar {public static void main(String[] args) {Car car = new Santana();System.out.println("-------------------包装前-------------------");car.show();RadarCar rcar = new RadarCar(car);System.out.println("-------------------包装后-------------------");rcar.show();}}

PS:自动泊车和倒车影像同理,代码中没有写明。






0 0
原创粉丝点击