设计模式(九)--------------装饰器模式

https://www.bilibili.com/video/av29579073/?p=16

今天这篇博客我来说一下装饰器模式。

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。装饰器模式相比生成子类会更加灵活。

装饰器模式由于较为复杂,涉及到的类也是比较多的。总体分为四个部分

– Component抽象构件角色: • 真实对象和装饰对象有相同的接口。这样,客户端对象就能够以与真实对象相同的方式同装饰 对象交互。这是一个最基本的接口,声明了一个类组所具有的全部的功能。

– ConcreteComponent 具体构件角色(真实对象): • io流中的FileInputStream、FileOutputStream。这个类是对于Component接口的继承,实现了一些较为基础的方法。

以上两个部分都是基础部分的构建,下面是关于装饰器部分的说明。

– Decorator装饰角色: • 持有一个抽象构件的引用。装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象 。这样,就能在真实对象调用前后增加新的功能。这个类可以看到是负责处理用户请求的,它包含了一个ConcreteComponent 对象的引用并同时实现了Component构件声明的方法

– ConcreteDecorator具体装饰角色: • 负责给构件对象增加新的责任。它也是继承了Decorator这个抽象类的同时实现Component构件声明的方法,在对应的方法中实现了ConcreteComponent 构件已有的方法和自己新添加的,也就是装饰方法的说明。

装饰器模式运用最多的就是关于java自带的IO流的处理。视频也是模仿IO的实现方式实现了一个小车的功能实现模拟。

首先是抽象构件部分,也就是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();
	}
}

可以看到这个类持有一个Component接口的引用并且重写了相应的move()方法。接下来就是装饰器类具体的扩展,也就是对于Component组件功能的扩展说明。

//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();
	}
	
}

这几个类都是继承了SuperCar同时具有一个ICar的引用,实现了不同功能的小车的组合。下面来看测试类。

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("增加两个新的功能,飞行,水里游-------");
		WaterCar waterCar2 = new WaterCar(new FlyCar(car));
		waterCar2.move();
		
		
//		Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:/a.txt"))));
		
	}
}

这个测试列也是可以看出,基本功能的对象引用作为属性注入到相应的装饰器类的构造方法中,为我们的基本类实现了功能的扩展。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章