装饰模式

装饰模式(Decorator Pattern):装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

可以这么理解:人靠衣装马靠鞍,装饰模式就是给马装鞍,扩展功能。

装饰模式 4 种角色:
Component(抽象构件):定义一个抽象接口,以规范接收附加责任的对象。
Concrete Component(具体构件):实现Component(抽象构件),通过Concrete Decorator(具体装饰器) 为其添加职责。
Decorator(抽象装饰器):持有一个 Component(抽象构件) 对象的实例,并实现一个与Component(抽象构件) 接口一致的接口。
Concrete Decorator(具体装饰器):负责给Concrete Component(具体构件)添加上附加的责任。

示例:以孙悟空成长为例:从石猴一路技能装饰升级,成为齐天大圣

// Component(抽象构件): 猴子
public interface Monkey{

	// 展示技能
	void showSkill();
}
//Concrete Component(具体构件): 孙悟空
public class SunWuKong implements Monkey{
	
	@Override
	public void showSkill(){
		System.out.println("沐猴而冠");
	}
}
// 抽象装饰器(Decorator):技能
public abstract class Skill implements Monkey{

	protected Monkey monkey;

	public Skill(Monkey monkey){
		this.monkey = monkey;
	}

	@Override
	public void showSkill(){
		monkey.showSkill();
	}
}
//具体装饰器(Concrete Decorator):腾云驾雾
public class FlyingDecorator extends Skill{

	public FlyingDecorator(Monkey monkey){
		super(monkey);
	}

	@Override
	public void showSkill(){
		super.showSkill();
		fly();
	}

	private void fly(){
		System.out.println("腾云驾雾!");
	}
}
//具体装饰器(Concrete Decorator):耍大棒
public class PlayStickDecorator extends Skill{

	public PlayStickDecorator(Monkey monkey){
		super(monkey);
	}

	@Override
	public void showSkill(){
		super.showSkill();
		playStick();
	}

	private void playStick(){
		System.out.println("耍大棒!");
	}
}
// 测试
public class Test {
    public static void main(String[] args) {

		System.out.println("刚从石头蹦出来时所具有技能:");
        Monkey monkey = new SunWuKong();
		monkey.showSkill();

		System.out.println("\n\r获得筋斗云后所具有技能:");
		monkey = new FlyingDecorator(monkey);
		monkey.showSkill();

		System.out.println("\n\r获得金箍棒后所具有技能:");
		monkey = new PlayStickDecorator(monkey);
		monkey.showSkill();
    }
}
输出结果如下:
刚从石头蹦出来时所具有技能:
沐猴而冠

获得筋斗云后所具有技能:
沐猴而冠
腾云驾雾!

获得金箍棒后所具有技能:
沐猴而冠
腾云驾雾!
耍大棒!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值