一文搞懂装饰者模式

版权声明:本文为博主原创,未经博主允许不得转载。 https://blog.csdn.net/LMD802/article/details/83931357
常见设计模式:
工厂模式,单例模式,装饰器模式,代理模式,适配器模式等
Java中IO使用的是装饰设计模式:
抽象构件:抽象被装饰者,一般是接口
具体构件:具体被装饰者,实现抽向构件
抽象角色:抽象装饰者, 抽象角色也去实现抽向构件:多态使用抽象构件做成员变量
重写接口方法
具体角色:具体修饰者继承抽象角色,重写父类方法
抽象构件:抽象被装饰者,一般是接口,接口目的是为了实现多态
/**
 * 抽象构件:抽象被装饰者
 */
public interface GuoDi {
	/**
	 * 获取锅底名字
	 * @return 
	 */
	String getName();
	/**
	 * 获取锅底价格
	 * @return
	 */
	
	int getPrice();
	
}
具体构件:具体被装饰者,实现抽向构件
/**
 *具体构件: 具体被装饰者
 *具体构件实现抽象构件
 *
 *清汤锅底
 */
public class QingSoup implements GuoDi {

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return "清汤";
	}

	@Override
	public int getPrice() {
		// TODO Auto-generated method stub
		return 30;
	}
}
抽象角色:抽象装饰者

抽象角色也去实现抽向构件:多态使用抽象构件做成员变量,
这样就可以在对象中嵌套构件重写接口方法

/**
 * 抽象角色也去实现抽向构件
 * 抽象角色写成抽象类
 */
public abstract class Cai implements GuoDi {
	//使用抽象构件做成员变量
	private GuoDi guoDi;
	/**
	 * 添加有参构造
	 * @param guoDi
	 */
	public Cai(GuoDi guoDi) {
		super();
		this.guoDi = guoDi;
	}
	/*public Cai() {
		// TODO Auto-generated constructor stub
	}*/

	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return guoDi.getName();
	}
	@Override
	public int getPrice() {
		// TODO Auto-generated method stub
		return guoDi.getPrice();
	}
}
具体角色:具体修饰者继承抽象角色,重写父类方法
public class WhiteCai extends Cai {
//具体角色构造器参数有抽象构件的引用,方便创建具体构件
//添加有参构造:为了嵌套
	public WhiteCai(GuoDi guoDi) {
		super(guoDi);
	}
	
	//重写父类方法
	
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return super.getName() + ",白菜";
	}

	@Override
	public int getPrice() {
		// TODO Auto-generated method stub
		return super.getPrice() + 15;
	}
}
测试:
/**
 * 测试火锅
 *
 */
public class TestHotpot {
	public static void main(String[] args) {
		
		GuoDi guoDi = new WhiteCai(new QingSoup());
		
		System.out.println(guoDi.getName() + guoDi.getPrice());
		
	}
}

猜你喜欢

转载自blog.csdn.net/LMD802/article/details/83931357