架构师训练营」第 3 周作业

发布于: 23 小时前
架构师训练营」第 3 周作业

作业一:

请在草稿纸上手写一个单例模式的实现代码,拍照提交作业。

单例模式的7种实现方案 (饿汉式 懒汉式 懒汉式(线程安全模式) 双检锁 双检锁(volatile模式)

静态内部类 枚举类)

饿汉式

枚举单例

作业二:

请用组合设计模式编写程序,打印输出图 1 的窗口,窗口组件的树结构如图 2 所示,打印输出示例参考图 3。 1、组合模式的使用场景

从上面我们可以看到,组合模式可以使用一棵树来表示,一共有三个角色:

1)组合部件(Component)

2)叶子(Leaf

3)合成部件(Composite)

下面代码实现一下组合模式。

1.组合部件(Component

package org.example;

/**

* 组件抽象类

* @author: qianjiang

* @date: 2020/6/23

*/

public interface Component {

/**

* 打印组件信息

* @param prefix 前缀

*/

void printComp(String prefix);

}

2.叶子(Leaf)

package org.example;

/**

* 叶子节点

* @author: qianjiang

* @date: 2020/6/23

*/

public class Leaf implements Component{

/**

* 叶子节点名称

*/

private String name;

public Leaf(String name){

this.name = name;

}

@Override

public void printComp(String preStr) {

System.out.println(preStr + "子= " + name);

}

}

3.合成部件(Composite)

package org.example;

import java.util.ArrayList;

import java.util.List;

/**

* 合成部件

*/

public class Composite implements Component{

/*** 节点名称 */

private String name;

/*** 子节点名称 */

private List<Component> children = new ArrayList<>();

public Composite(String name) {

this.name = name;

}

/**

* 增加一个子组件

* @param child 子构件对象

*/

public void addChild(Component child){

children.add(child);

}

@Override

public void printComp(String prefix) {

System.out.println(prefix + "父= " + name);

if(null != children){

for(Component c : children){

c.printComp(prefix + prefix);

}

}

}

}

4 测试(AppClient

package org.example;

/** 测试*/

public class AppClient {

public static void main(String[] args){

Composite window = new Composite("print WinForm (WINDOW窗口)");

Leaf picture = new Leaf("print Picture(Logo图片)");

Leaf loginButton = new Leaf("print Button(登录)");

Leaf registerButton = new Leaf("print Button(注册)");

Composite fream1 = new Composite("print Frame(FRAME1)");

Leaf userNameLable = new Leaf("print Lable(用户名)");

Leaf textBox = new Leaf("print TextBox(文本框)");

Leaf passwordLable = new Leaf("print Lable(密码)");

Leaf passwordBox = new Leaf("print PasswordBox(密码框)");

Leaf checkBox = new Leaf("print CheckBox(复选框)");

Leaf rememberUserNametextBox = new Leaf("print TextBox(记住用户名)");

Leaf forgetLinkLable = new Leaf("print LinkLable(忘记密码)");

window.addChild(picture);

window.addChild(loginButton);

window.addChild(registerButton);

window.addChild(fream1);

fream1.addChild(userNameLable);

fream1.addChild(textBox);

fream1.addChild(passwordLable);

fream1.addChild(passwordBox);

fream1.addChild(checkBox);

fream1.addChild(rememberUserNametextBox);

fream1.addChild(forgetLinkLable);

String prefix = " ";

window.printComp(prefix);

}

}

总结

1、组合模式的使用场景

当想表达对象的部分-整体的层次结构时。

希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象时。

2、优缺点

缺点:客户端需要花更多时间理清类之间的层次关系

优点:无需关系处理的单个对象,还是组合的对象容器,实现容器之间的解耦合。当有新部件时容易添加进来。

OK,组合模式就先到这,如有问题还请批评指正。

用户头像

iedd

关注

还未添加个人签名 2018.01.18 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营」第 3 周作业