装饰器设计模式(decorator)

1. 职责:

 动态的为一个对象增加新的功能。

 装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀

2. 实现细节:

1) Component抽象构件角色:

真实对象和装饰对象有相同的接口。这样,客户端对象就能够以与真实对象相同的方式同装饰对象交互。

2) ConcreteComponent 具体构件角色(真实对象)

io流中的FileInputStream、FileOutputStream

3) Decorator装饰角色:

持有一个抽象构件的引用。装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象。这样,就能在真实对象调用前后增加新的功能。

4) ConcreteDecorator具体装饰角色:

负责给构件对象增加新的责任。

 

 

 

3. 简单案例说明:

 

 

 

4. UML类图

 

 

 

5. 示例代码

package com.lengfengtyf.装饰模式;

 

// 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) {

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("天上飞...");

}

@Override

public void move() {

super.move();

fly();

}

}

//ConcreteDecorator具体装饰角色

class WaterCar extends SuperCar {

public WaterCar(ICar car) {

super(car);

}

public void swim() {

System.out.println("水里游...");

}

@Override

public void move() {

super.move();

swim();

}

}

//ConcreteDecorator具体装饰角色

class AICar extends SuperCar {

public AICar(ICar car) {

super(car);

}

public void autoMove() {

System.out.println("自动开...");

}

@Override

public void move() {

super.move();

autoMove();

}

}

package com.lengfengtyf.装饰模式;

 

/**

 * 装饰器设计模式测试类

 *

 * @author fang

 * @date 2019429

 * @version v1.0

 */

public class Client {

 

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("***********添加飞行、水上游、自动功能...***********");

FlyCar car2 = new FlyCar(new WaterCar(new AICar(new Car())));

car2.move();

}

 

}

 

6. 开发中使用的场景:

 IO中输入流和输出流的设计。

 Swing包中图形界面构件功能。

 Servlet API 中提供了一个request对象的Decorator设计模式的默认实现类HttpServletRequestWrapper,HttpServletRequestWrapper 类,增强了request对象的功能。

 Struts2中,request,response,session对象的处理。

posted @ 2021-10-10 22:45  timelfb  阅读(124)  评论(0)    收藏  举报