装饰设计模式

装饰设计模式:面向对象的大boss(GOF)

四大部件

1、抽象组件:需要装饰的抽象对象(接口或抽象父类)
2、具体组件:需要装饰的对象
3、抽象装饰类:包含了对抽象组件的引用以及装饰着共有的方法
4、具体装饰类:被装饰的对象


调用关系

这个图表达的是装饰设计模式的继承关系

抽象组件
具体组件
抽象装饰类
具体装饰类

这个图表达的是装饰设计模式反复调用的时候,我们的到的关系

抽象组件
具体组件
抽象装饰类
具体装饰类
具体组件类实例
具体装饰类实例

例子:

1.抽象组件:装饰的抽象对象(接口或抽象父类)

定义一个接口用于统一的规范

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

2.具体组件:需要装饰的对象

实现接口类

//具体组件 class Coffee implements Drink{  private String name ="原味咖啡";  @Override  public double cost() {   return 10;  }  @Override
public String info() {
return name;
}
}

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

  public String info() {
   return name;
  }
  
 }

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

//具体装饰类
	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()+"加入了蔗糖";
		}	
	}

全部代码:

//抽象组件
	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()+"加入了蔗糖";
		}	
	}

调用代码

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

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值