您的位置:首页 > 编程语言 > Java开发

装饰者模式

2019-05-24 07:11 1861 查看

 代理模式与装饰者模式看起来很像,都实现基础对象实现的接口,在其自身对象中都保存着对被代理/被装饰者的对象引用
  先来看看装饰者模式的定义:动态的将责任附加到被装饰者对象上,用于扩展对象的功能。比继承的灵活性大。典型的如Java IO的设计即是装饰者模式的典型应用。
  代理模式模式的定义:对其他对象进行代理,以控制对被代理对象的访问。Spring的为业务逻辑层方法生成的代理类,主要进行一些事务控制等。
  由定义可以看出装饰的责任是扩展功能 ,而代理主要控制访问。

 

什么是装饰模式

继承和装饰者模式都是一种对基本功能的拓展,装饰者模式比继承更加的灵活。前提是被装饰的类要实现了某个接口。

简单实现

拿一开始说的那个人为例子。人是个抽象的概念。男孩是个具体的人。但是这个人要干不同的事情要穿不一样的衣服,就需要进行不同的包装。

抽象的人:

public abstract class Person {
public abstract void dress();
}

 

具体的人,也是原始的人,被装饰者

public class Boy extends Person {
@Override
public void dress() {
System.out.println("穿内衣内裤");
}
}

抽象的装饰者:

public abstract class PersonDecorator {
Person person;

public PersonDecorator(Person person) {
this.person = person;
}

public void dress(){
person.dress();
}
}

工作人装饰者:

public class WorkPersonDecorator extends PersonDecorator {
public WorkPersonDecorator(Person person) {
super(person);
}

@Override
public void dress() {
super.dress();
dressWork();
}

private void dressWork(){
System.out.println("穿西装领带");
}
}

运动的人装饰者:

public class SportPersonDecorator extends PersonDecorator {
public SportPersonDecorator(Person person) {
super(person);
}

@Override
public void dress() {
super.dress();
dressSport();
}
private void dressSport(){
System.out.println("穿运动衣");
}
}

客户端调用:

public class Client {
public static void main(String[] args) {
Person boy = new Boy();

System.out.println("包装一个上班人:");
WorkPersonDecorator workPersonDecorator = new WorkPersonDecorator(boy);
workPersonDecorator.dress();

System.out.println("包装一个运动的人:");
SportPersonDecorator sportPersonDecorator = new SportPersonDecorator(boy);
sportPersonDecorator.dress();
}
}

总结

装饰模式和前面的代理模式有点类似,容易把装饰模式看成代理模式。装饰模式是继承的一种替代方案,主要为所装饰的对象增强功能,动态的增加方法。而代理模式主要是为了控制对原有对象的访问权限,不对原有对象进行功能增强。

我觉得两者的区别主要是使用目的的区别。

优点

是继承的一种替代方案,但是比继承要灵活的多,可以在运行时通过传入不同的被装饰器或不同的装饰器来达成不同的行为。 增加新的被装饰类和装饰类很方便,而且不用修改原有代码。便于拓展。符合开闭原则。

缺点

设计模式基本都有这个缺点,就是会生成额外的类,增加系统复杂度。 由于装饰可以层层包装,交叉包装,如果包装的很深的话,调试排错会比较麻烦,也不容易理解。

 

(adsbygoogle = window.adsbygoogle || []).push({});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring Java