设计模式之装饰者模式

装饰者模式:定义是在不改变原对象功能的情况下,动态的给原对象添加新功能,相比于通过继承来扩展功能要灵活的多。

设计理念是:定义一个装饰者对原对象的一个封装

要点是:装饰者和被装饰者(需要被扩展功能的原对象)都有一个共同的超类,继承的是类型,而不是方法的复制

包含的角色:

抽象被装饰者:装饰者和被装饰者的共同超类,定义了具体被装饰者的公共行为。

具体被装饰者:继承抽象被装饰者,实现抽象被装饰者的公共方法

抽象装饰者:一个抽象类,也继承抽象被装饰者,继承的是类型,使装饰者和被装饰者处于一个类型下

具体装饰者:继承了抽象装饰者,给被装饰者时添加新功能

应用场景:手机有一个基础功能打电话,这个功能不能满足人们的需求了,就要给它加上一些新的功能,如发短信,上网,玩游戏,听音乐,看视频等等功能。。。。我们首先想到的是用继承来扩展,但是如果路人甲只要打电话、发短信的功能的,那么我们就原手机对象,加上发短信功能。。。而路人乙要能打电话、发短信、上网,那么又要继承。。。。。不同的人要的功能不一样就要写很多很多继承类了。。。会出现代码冗余,出现很多的子类,管理其他不方便。。。。。这时我们就可以使用装饰者模式来进行动态扩展了。

先来图简单说明下:丑了点,将就下


上代码:

抽象被装饰者,基类

public interface Phone {
	public void gongneng();
}

具体被装饰者

public class Aphone implements Phone {

	public void gongneng() {
		System.out.println("能打电话");
	}
}

抽象装饰者

public abstract class Decorator implements Phone{
	protected Phone iphone;
	public Decorator(Phone phone){
		this.iphone=phone;
	}
}

具体装饰者

public class AphoneDecorator extends Decorator {
	public AphoneDecorator(Phone phone) {
		super(phone);
	}
	//添加个发短信功能
	public void gongneng(){
		this.iphone.gongneng();
		System.out.println("能发短信");
	}
}
public class BphoneDecorator extends Decorator {
	public BphoneDecorator(Phone phone) {
		super(phone);
	}
	//给手机扩展一个上网功能
	public void gongneng(){
		this.iphone.gongneng();
		System.out.println("能上网");
	}
}

测试

	public static void main(String[] args) {
		Aphone iphone = new Aphone();
		BphoneDecorator idecorator = new BphoneDecorator(iphone);
		AphoneDecorator adecorator = new AphoneDecorator(idecorator);
		adecorator.gongneng();
	}

结果

能打电话
能上网
能发短信

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值