Java IO_原理剖析_装饰器设计模式 尚学堂180

https://www.bilibili.com/video/BV1ct411n7oG?p=181


GOF设计模式

装饰器设计模式

模拟一个声音放大器:


/**
 * 实现放大器对声音的放大功能
 */
public class Test {

	public static void main(String[] args) {
		Person p = new Person();
		p.say();
		
		//装饰
		Amplifier am = new Amplifier(p);
		am.say();
	}

}

interface Say{
	void say();
}

class Person implements Say{
	//属性
	private int voice = 10;

	public int getVoice() {
		return voice;
	}

	public void setVoice(int voice) {
		this.voice = voice;
	}

	@Override
	public void say() {
		System.out.println("人的声音为:" + this.getVoice());
	}
	
}

class Amplifier implements Say{
	private Person p;
	public Amplifier(Person p) {
		this.p = p;
	}

	@Override
	public void say() {
		System.out.println("人的声音为:" + p.getVoice() * 100);
		System.out.println("噪音。。。");
	}
	
}

输出结果:

人的声音为:10
人的声音为:1000
噪音。。。

加了个属性,在构造器里将对象传进来,然后再方法里调用原对象的方法进行处理。 


 装饰设计模式有4个角色,由组件和装饰者组成。

有四大组成部分:

1、抽象组件:需要装饰的抽象对象(一般是接口或则抽象父类)

2、具体组件:需要装饰的对象(刚才的Person人)

3、抽象装饰类:内部包含了对抽象组件的引用以及装饰者共有的方法

4、具体装饰类:被装饰的对象


模拟咖啡:


/**
 * 实现放大器对声音的放大功能
 */
public class Test {

	public static void main(String[] args) {
		Drink coffee = new Coffee();
		Drink coffee2 = new Coffee();
		Drink milk = new Milk(coffee);//装饰
		System.out.println(milk.info() + "-->" + milk.cost());
		Suger suger = new Suger(coffee2);//装饰
		System.out.println(suger.info() + "-->" + suger.cost());
		
		milk = new Milk(suger);//装饰
		System.out.println(milk.info() + "-->" + milk.cost());
	}

}

//抽象组件
interface Drink{
	double cost();//费用
	String info();//说明
}

//具体组件
class Coffee implements Drink{
	private String name = "原味咖啡";

	@Override
	public double cost() {
		return 10;
	}

	@Override
	public String info() {
		return name;
	}
}

//抽象装饰类
abstract class Decorate implements Drink{
	//对抽象组件的引用
	private Drink drink;
	public Decorate(Drink drink) {
		this.drink = drink;
	}
	
	@Override
	public double cost() {
		return this.drink.cost();
	}

	@Override
	public String info() {
		return this.drink.info();
	}
}

//具体装饰类
class Milk extends Decorate{

	public Milk(Drink drink) {
		super(drink);
	}
	
	@Override
	public double cost() {
		return super.cost() * 4;
	}

	@Override
	public String info() {
		return super.info() + "加入了牛奶";
	}
}

//具体装饰类
class Suger extends Decorate{

	public Suger(Drink drink) {
		super(drink);
	}
	
	@Override
	public double cost() {
		return super.cost() * 2;
	}

	@Override
	public String info() {
		return super.info() + "加入了蔗糖";
	}
}

输出结果:

原味咖啡加入了牛奶-->40.0
原味咖啡加入了蔗糖-->20.0
原味咖啡加入了蔗糖加入了牛奶-->80.0


 

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页