------------------------------------------------android培训、java培训、期待与您交流!-----------------------------------------------
❶概念
装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象
❷特点
1.装饰对象和真实对象有相同的接口这样客户端对象就可以和真实对象相同的方式和装饰对象交互
2.装饰对象包含一个真实对象的引用(reference)
3.装饰对象接受所有来自客户端的请求。它把这些请求转发给真实的对象。
4.装饰对象可以在转发这些请求以前或以后增加一些附加功能。这样就确保了在运行时,不用修改给定对象的结构就可以在外部增加附加的功能。在面向对象的设计中,通常是通过继承来实现对给定类的功能扩展
❸装饰模式UML图
❹装饰模式的实现
装饰模式是利用setComponent来对对象进行包装的
//该接口定义操作
public interface Component
{
public void operation();
}
//该类具体实现该操作,可以说是系统最核心的主要行为
public class ConcreteComponent implements Component
{
@Override
public void operation()
{
System.out.println("完成了一大堆的复杂操作");
}
}
//该抽象类用于扩展装饰类,实现了接口方便调用
//装饰类只有在某种特殊的情况下才会被调用
public abstract class Decorator implements Component
{
//保存一个引用组件类
protected Component component;
public void setComponent(Component component)
{
this.component=component;
}
@Override
public void operation()
{
//调用具体组件类的实现
if(component!=null)
{
component.operation();
}
}
}
//继承Decorator类并复写operation函数并加上要装饰的内容
public class ConcreteDecoratorA extends Decorator
{
@Override
public void operation()
{
//相当于调用ConcreteComponent里面的operation方法
super.operation();
System.out.println("装饰功能1");
}
}
public class MainClass
{
public static void main(String[] args)
{
ConcreteComponent component=new ConcreteComponent();
ConcreteDecoratorA a=new ConcreteDecoratorA();
ConcreteDecoratorB b=new ConcreteDecoratorB();
//连续装饰component两次
a.setComponent(component);
b.setComponent(a);
a.operation();
}
}
自己的总结:ConcreteComponent实现了系统最核心和基本的功能,当我们对需求有变化但是需求只是想
改变一下某些装饰作用,不改变原来的功能,如添加日志功能等等,那么我们就可以利用装饰模式
❺优点及缺点
①优点
1.Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性
2.通过使用不同的具体装饰类以及这些装饰类的排列组合,可以创造出很多不同行为的组合
②缺点
1.这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性
2.装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂
-----------------------------------------android培训、java培训、java学习型技术博客、期待与您交流! --------------------------