Java23种设计模式——组合模式

该系列文章为博主学习笔记,原文请参考参考链接
本文禁止转载,但是欢迎大家留言区留言交流[微笑]

理(面)解(试)组合模式:
组合模式为树形结构提供了的解决方案,它描述了如何将容器和叶子进行递归组合,通过定义了一个抽象构件类,它既可以代表叶子,又可以代表容器。使得用户在使用时无须对它们进行区分,可以一致地对待容器和叶子。

在组合模式中分为容器类和控件类,容器里面可以放若干个控件,但是容器里面也可以放置容器,在容器类中我们会有添加(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值