……
假设有一个接口Human,一个接口的实现类Man。人类Human是可以跑步的,但是不能飞。
如果想给人类加上飞翔的翅膀,可以有三种解决方案:
1.修改实现类Man的方法,但不符合开闭原则 2.给实现类Man添加一个子类,扩展一个人类可以飞的功能。问题在于,如果又想给人类增加猎豹般奔跑的速度,需要继续扩展一个子类。显然,使用继承的方式去扩展一个类的功能,会增加类的层级,类的臃肿会加大维护的成本。 3.使用装饰模式扩展一个类的功能。好处在于,如果继承关系是纵向的,那么装饰类则是某个类横向的扩展,并不会影响继承链上的其他类。例如:C extends B , B extends A,如果需要扩展B的功能,可以设计一个B的装饰类,它并不会影响B的子类C。如果采用在B里面增加方法,势必会使B的所有子类结构被改变。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 package com.kevin.结构型模式.装饰模式.decorator;public interface ICar { void move () ; } class SuperCar implements ICar { protected ICar car; public SuperCar (ICar car) { this .car = car; } @Override public void move () { car.move(); } } class Car implements ICar { @Override public void move () { System.out.println("陆地行驶!" ); } } class FlyCar extends SuperCar { public FlyCar (ICar car) { super (car); } public void fly () { System.out.println("天上行驶" ); } @Override public void move () { car.move(); fly(); } } class WaterCar extends SuperCar { public WaterCar (ICar car) { super (car); } public void swim () { System.out.println("水上行驶" ); } @Override public void move () { car.move(); swim(); } } class AICar extends SuperCar { public AICar (ICar car) { super (car); } public void autoMove () { System.out.println("自动行驶" ); } @Override public void move () { car.move(); autoMove(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 package com.kevin.结构型模式.装饰模式.decorator;public class Test { public static void main (String[] args) { Car car = new Car (); car.move(); System.out.println("增加新的功能,飞行..." ); FlyCar flyCar = new FlyCar (car); flyCar.move(); System.out.println("增加新的功能,水里游..." ); WaterCar waterCar = new WaterCar (car); waterCar.move(); System.out.println("增加两个新的功能,飞行、水里游..." ); WaterCar waterCar1 = new WaterCar (new FlyCar (car)); waterCar1.move(); } }