该系列文章为博主学习笔记,原文请参考参考链接
本文禁止转载,但是欢迎大家留言区留言交流[微笑]
理(面)解(试)组合模式:
组合模式为树形结构提供了的解决方案,它描述了如何将容器和叶子进行递归组合,通过定义了一个抽象构件类,它既可以代表叶子,又可以代表容器。使得用户在使用时无须对它们进行区分,可以一致地对待容器和叶子。
在组合模式中分为容器类和控件类,容器里面可以放若干个控件,但是容器里面也可以放置容器,在容器类中我们会有添加(add),删除(dele)等方法对容器里面的控件进行增加和删除。而对于控件类,它本身就是一个控件,里面已经没有了子控件,所以我们就没有添加或者删除这些方法。
组合模式分为透明组合模式和安全组合模式两种。
透明模式:
透明模式是指容器类和控件类同时实现了Component构造方法,并重写所有的抽象方法。但是上面说到了对于控件类,没有添加或者删除方法,所以我们要对控件类中这些方法进行异常提示,这样显得太麻分了所以建议采用安全模式。在透明模式中,客户端可以统一对抽象构件Component进行编程。
安全模式:
安全模式是指,在抽象构件中只保留容器类和控件类的基本操作,比如显示功能(display,图中为operation),然后在容器类添加适合容器类的方法,比如添加和删除等操作。但是在客户端中就不能针对抽象构件Component类进行编程。因为添加和删除等操作都是容器类中的方法,我们应该使用具体的容器类代替。
下面针对安全模式进行代码展示:
public abstract class AbstractView {
public abstract void display();
}
//控件类Button
public class Button extends AbstractView {
private String name;
public Button(String name) {
this.name = name;
}
@Override
public void display() {
System.out.println("----对["+name+"]进行展示----");
}
}
//文本框类EditText
public class EditText extends AbstractView {
private String name;
public EditText(String name) {
this.name = name;
}
@Override
public void display() {
System.out.println("----对[" + name + "]进行展示----");
}
}
//容器类
public class Window extends AbstractView {
private List<AbstractView> views = new ArrayList<AbstractView>();
private String name;
public Window(String name) {
this.name = name;
}
public void addView(AbstractView view) {
views.add(view);
}
public void deleView(AbstractView view) {
views.remove(view);
}
public AbstractView getView(int index) {
return views.get(index);
}
@Override
public void display() {
System.out.println("****对" + name + "进行展示****");
for (AbstractView view : views) {
view.display();
}
}
}
public class MyClass {
public static void main(String[] args) {
//将控件类设置成AbstractView(抽象构件)类型。
AbstractView button1, editText1, button2, editText2;
//因为添加删除等操作只有容器类存在,所以应该声明为具体类型。
Window window, window1, window2;
window1=new Window("子窗体1");
button1=new Button("按钮1");
editText1=new EditText("文本框1");
window1.addView(button1);
window1.addView(editText1);
window2=new Window("子窗体2");
button2=new Button("按钮2");
editText2=new EditText("文本框2");
window2.addView(button2);
window2.addView(editText2);
window=new Window("窗体");
window.addView(window1);
window.addView(window2);
window.display();
}
}
输出
*对窗体进行展示*
*对子窗体1进行展示*
—-对[按钮1]进行展示—-
—-对[文本框1]进行展示—-
*对子窗体2进行展示*
—-对[按钮2]进行展示—-
—-对[文本框2]进行展示—-
以上就是安全模式,之所以叫安全模式是因为控件类根本无法调用添加或者删除等操作,避免了异常的处理,但是该模式也存在缺点。客户端不能完全针对抽象编程,必须有区别地对待容器类。
微信公众号:
QQ交流群:365473065