该系列文章为博主学习笔记,原文请参考参考连接
本文禁止转载,但是欢迎大家留言区留言交流[微笑]
透明装饰模式
今天研究了一下装饰者模式,简单谈一谈对其理解就是通过一个装饰类(Decorator)将基本操作类和增强操作类连接起来,将两者分开来。
并且在这个装饰类(Decorator)保留对基本操做类进行关联,使其在进行扩展操作的同时可以调用基本操作。
流程图:
基本操作就比如说对文字设置颜色,而拓展操作是在设置完文字颜色的基础上设置背景颜色,比如说Button为了显示出为按钮可以为背景设置灰色,而TextView是文本,可以为背景色设置成透明色。
这里装饰类Decorator里面关联了Component对象,而基本操作类Color实现了Component对象,维护了一个指向基本操作的引用,通过该引用可以调用基本操作的对象。
扩展操作类(Button,TextView)泛化(继承)了装饰类,在装饰类中并不增加增强操作,而是在他的子类中根据自身类不同的特点进行添加增强操作。
代码:
public abstract class Component
{
public abstract void display();
}
public class ComponentDecorator extends Component {
private Component component;
public ComponentDecorator(Component component) {
this.component = component;
}
@Override
public void display() {
component.display();
}
}
public class BlackBorderDecorator extends ComponentDecorator {
public BlackBorderDecorator(Component component) {
super(component);
}
@Override
public void display() {
setBlackBorderDecorator();
super.display();
}
private void setBlackBorderDecorator() {
System.out.println("增加了背景颜色");
}
}
public class ScrollBarDecorator extends ComponentDecorator {
public ScrollBarDecorator(Component component) {
super(component);
}
@Override
public void display() {
setScrollBarDecorator();
super.display();
}
private void setScrollBarDecorator() {
System.out.println("增加了滚动条");
}
}
public class Window extends Component{
@Override
public void display() {
System.out.println("显示功能");
}
}
public class MyClass {
public static void main(String[] args) {
Component component,componentBB,componentSB;
component=new Window();
componentBB=new ScrollBarDecorator(component);
componentSB=new BlackBorderDecorator(componentBB);
componentSB.display();
}
}
输出:
增加了背景颜色
增加了滚动条
显示功能
以上采用的是装饰者模式的透明模式,透明模式的意思是:要求客户端程序不应该将对象声明为具体的类,而应该全部声明为Component类型。透明装饰模式可以让客户端透明地使用装饰之前的对象和装饰之后的对象,无须关心它们的区别,此外,还可以对一个已装饰过的对象进行多次装饰,得到更为复杂、功能更为强大的对象。
半透明装饰模式
简单举个例子,比如我们需要在类ScrollBarDecorator中增加方法
private void setDelete(){
System.out.println("删除滚动条");
}
但是我就想单独调用他,但是我们的客户端全部都是面向抽象类编程,里面并没有setDelete() 方法。
所以我们只能对客户端进行如下更改:
public class MyClass {
public static void main(String[] args) {
Component component;
ScrollBarDecorator componentSB;
component=new Window();
componentSB=new ScrollBarDecorator(component);
componentSB.setDelete();
}
}
半透明性可以对额外的一些方法进行调用,灵活性很大,但是缺点是不能对同一对象多次装饰。
我认为不能对统一对象多次装饰是因为你可能新增加的方法(setDelete)没有调用父类,并且你Component接口中也没有这个方法,所以无法在向上装饰。
微信公众号:
QQ群:365473065