装饰者模式--Decorator

1: 作用

动态的给对象增加执行的业务,不受数量限制。可以代替子类,同时避免子类与父类的高耦合。增加灵活性。

2:构成

2.1 装饰者抽象类--Decorator (可以是接口)

最终生成一个指向被装饰对象基类(Component)实例的引用,并定义一个与被装饰对象基类(Component)接口一致的接口。

通过这个抽象类或接口来指向具体的执行对象。

2.2 被装饰的对象的基类--Component 

放在最里面核心的位置,用来生成基础的被装饰对象,可以给这个对象动态的添加职责。

2.3具体被装饰对象--ConcreteComponent

生成具体的装饰对象,其属性中包含一个装饰者抽象类Decorator对象,一般拥有一个含参的构造方法,参数为一个装饰者抽象类Decorator对象,用来设置属性中的装饰者抽象类Decorator对象。

2.4 具体的装饰者 - ConcreteDecorator

最终的操作者,给内部的被装饰的对象增加(装饰对象的)职责。

3 例

目的:造一座房子 ;  装饰:门,窗,床。

可以任意的给这座房子装饰 门,窗,床中的一种或几种。顺序也可以改变。

//装饰者抽象类
public interface Build {
	public void act();

}

//具体装饰
public class BuildBed implements Build {

	Build bud;
	public BuildBed(Build bu){
		this.bud = bu;
	}
	@Override
	public void act() {
		// TODO Auto-generated method stub
		System.out.println("造一架床");
		this.bud.act();
	}

}

//具体装饰
public class BuildDoor implements Build {
	Build bud;
	public BuildDoor(Build bu){
		this.bud = bu;
	}
	@Override
	public void act() {
		// TODO Auto-generated method stu
		System.out.println("修一个门");
		this.bud.act();

	}

}

//具体装饰
public class BuildWindow implements Build {
	Build bud;
	public BuildWindow(Build bu){
		this.bud = bu;
	}
	@Override
	public void act() {
		// TODO Auto-generated method stub
		System.out.println("修一个窗");
		this.bud.act();
	}

}

//具体被装饰对象
public class House implements Build {

	@Override
	public void act() {

		System.out.println("造一座房子");
	}

}


public class test {


	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//修一个门;修一个窗;造一座房
		Build bud1 =  new BuildDoor(new BuildWindow(new House()));
		bud1.act();

		//造一架床;修一个窗;修一个门,造一座房
		Build bud2 = new BuildBed( new BuildWindow(new BuildDoor( new House())));
		bud2.act();
	}

}

具体装饰之上可以抽象出一层装饰者抽象类。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装饰器模式是一种结构型设计模式,它可以动态地给对象添加额外的职责,同时又不需要修改原有的代码。在电商领域中,我们可以使用装饰器模式来实现优惠活动价格计算。 首先,我们需要定义一个抽象组件,代表商品或服务: ```python from abc import ABC, abstractmethod class Component(ABC): @abstractmethod def get_price(self): pass ``` 然后,我们定义具体的商品: ```python class Product(Component): def __init__(self, name, price): self.name = name self.price = price def get_price(self): return self.price ``` 接下来,我们定义装饰器: ```python class Decorator(Component): def __init__(self, component): self.component = component def get_price(self): return self.component.get_price() ``` 其中,`Decorator` 继承自 `Component` ,它包含一个对抽象组件的引用,代表要装饰的组件。 然后,我们定义具体的装饰器,用来实现各种优惠活动: ```python class Discount(Decorator): def __init__(self, component, discount_rate): super().__init__(component) self.discount_rate = discount_rate def get_price(self): return self.component.get_price() * self.discount_rate ``` `Discount` 继承自 `Decorator` ,它包含一个对抽象组件的引用,同时还有一个折扣率属性 `discount_rate`。`get_price` 方法将原始价格与折扣率相乘,得到折扣后的价格。 我们还可以定义其他的装饰器,如满减、满赠等等。 最后,我们可以使用这些装饰器来计算商品的最终价格: ```python product = Product('iPhone', 10000) discounted_product = Discount(product, 0.8) # 打八折 print(discounted_product.get_price()) # 输出 8000 ``` 这样,我们就通过装饰器模式实现了电商的优惠活动价格计算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值