设计模式——装饰模式
HeadFirst中装饰者模式的定义:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的的替代方案。
装饰模式的职责:动态的为一个对象增加新的功能。装饰模式是一种用于代替继承的技术,无需通过继承增加子类就可以扩展对象的功能,使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
看看大神的详解(就没话说了)http://blog.csdn.net/hguisu/article/details/7531960
补充一点,装饰模式在Java领域中的应用:
1.JavaIO中流的设计
2.Swing中图形界面的构件功能
3.Servlet和Struts2中request类的设计。
来模仿一下高淇老师的Demo
package com.wxisme.decorator; /** * 装饰设计模式 * @author wxisme @gaoqi * */ //构建角色接口Component public interface iCar { void move(); } //具体的构建角色ConcreteComponent class Car implements iCar { @Override public void move() { System.out.println("行驶在马路上 "); } } //Decorator装饰角色 class SuperCar implements iCar { protected iCar car; public SuperCar(iCar car) { super(); this.car = car; } @Override public void move() { car.move(); } } //一下是具体的装饰角色ConcreteDecorator class FlyCar extends SuperCar { public FlyCar(iCar car) { super(car); } public void fly() { System.out.println("汽车在天上飞 "); } public void move() { super.move(); fly(); } } class WaterCar extends SuperCar { public WaterCar(iCar car) { super(car); } public void swim() { System.out.println("汽车在水里游 "); } public void move() { super.move(); swim(); } } class AICar extends SuperCar { public AICar(iCar car) { super(car); } public void autoMove() { System.out.println("汽车在无人驾驶 "); } public void move() { super.move(); autoMove(); } }
package com.wxisme.decorator; /** * 测试装饰模式 * @author wxisme * */ public class DemoDecorator { public static void main(String[] args) { Car car = new Car(); car.move(); System.out.println("------------------"); //多态 SuperCar fcar = new FlyCar(car); fcar.move(); System.out.println("------------------"); WaterCar wc = new WaterCar(car); wc.move(); System.out.println("------------------"); WaterCar wc2 = new WaterCar(new FlyCar(new AICar(car))); wc2.move(); } }
运行结果:
行驶在马路上
------------------
行驶在马路上
汽车在天上飞
------------------
行驶在马路上
汽车在水里游
------------------
行驶在马路上
汽车在无人驾驶
汽车在天上飞
汽车在水里游
ps.装饰模式就这么愉快的学会了,要想用好还要不断地去实践啊。
作者:Pickle
声明:对于转载分享我是没有意见的,出于对博客园社区和作者的尊重一定要保留原文地址哈。
致读者:坚持写博客不容易,写高质量博客更难,我也在不断的学习和进步,希望和所有同路人一道用技术来改变生活。觉得有点用就点个赞哈。