装饰模式
我们在IO中见到过不少装饰模式,装饰模式就是对原有对象进行增强。
一般实现对象增强的三种方式:继承、装饰模式、代理模式
一、为什么需要装饰模式?
我们知道,子类继承父类,可以继承父类的属性,并进行扩展,但是如果需求变动大,需要扩展的功能很多,这时用继承就会发生这样一种现象:类数量多,继承的层次多。
所以像这种情况,如果用继承就非常不灵活。因此引入了装饰模式。
二、代码实现
前置代码:我们有一个电话接口Phone,和一个电话接口的实现类Iphone,Iphone的基础功能base()只有打电话。
- 写一个装饰器抽象类,用其构造器来接收实现类。装饰器的核心其实就是代理。
- 继承装饰器抽象类,将想要增强的对象传进去,扩展功能并重写base()方法。这样我们就得到了被增强装饰后的对象iphone2。iphone2这个对象就具有了被增强之后的功能(打电话,发信息,听音乐)。
代码实现+注释:
//电话接口
interface Phone{
void base();//可以打电话
}
//实现类:
class Iphone implements Phone{
public void base(){
System.out.println("打电话");
}
}
//此时我们有一个电话接口,一个电话的实现类,我们创建一个装饰器,它实现了电话接口,以组合的方式接收我们的默认实现类
abstract class Dec implements Phone{
private Phone phone;
public Dec(Phone phone){
this.phone = phone;
}
public void call() {
phone.base();
}
}
//继承装饰器来进行扩展
class Iphone2 extends Dec{
public Iphone2(Phone phone) {
super(phone);
}
//扩展的功能
public void sendMessage() {
System.out.println("发短信");
}
public void music() {
System.out.println("听音乐");
}
@Override
//重写电话的基本功能
public void base() {
super.call();
sendMessage();
music();
}
}
//测试类
public class Test1 {
public static void main(String[] args) {
Iphone ipohne = new Iphone();
Iphone2 iphone2= new Iphone2(iphone);
iphone2.base();
}
}
其实我们发现,这其实和IO的装饰模式是一样的
public static void main(String[] args) {
//原始的对象
Iphone ipohne = new Iphone();
//增强后的对象
Iphone2 iphnoe2= new Iphone2(iphone);
ip2.base();
}
三、装饰模式的优缺点
优点:
1.装饰类和被装饰类是可以互相独立的。低耦合
2.无论包装多少层,返回的对象都是is-a关系(包装完还是Phone类型)
is -a关系:苹果继承自水果,这是一种is-a关系,因为水果里肯定有苹果,这是种天然的关系,苹果继承自午饭,这是一种has-a关系,因为午饭可以有苹果也可以没有。
3.实现动态扩展,只要继承了装饰器就可以动态扩展想要的功能。
缺点:
多层装饰复杂,不利于调试
本文介绍装饰模式的概念、应用场景及实现方式,通过示例代码演示如何利用装饰模式为对象动态添加职责,同时讨论装饰模式的优点和局限。
2493

被折叠的 条评论
为什么被折叠?



