架构师训练营」第 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,组合模式就先到这,如有问题还请批评指正。
评论