雪一更--软件开发--design pattern 温故知新
目的:研习设计模式里对象间的构成,协作,关联关系。
2023-01-12
chainOfResponsibility:
责任的传递, 终结未处理抛出


2023-01-28
singleton 并发安全类。
只有一个实例,且提供全局访问的方式
扩展:State 模式下各类具体state, 可用singleton 来实现,无属性字段无状态,可安全使用.
todo : double-checked Locing , volatile
state 模式:
将状态抽象为对象,各种状态具象为子类。
注意: Client 持有 State, setState 方法 由各状态子类调用,各子类之间耦合,复杂度上升后用 Mediator 处理。
各子类用 singleton 模式实现,不包含属性,无状态。




command:
将命令或任务创建为对象.
常配合 composite 来组合。execute() 方法,每个子类实现自己独特的动作。
调用方持有 ICommand 集合,可排序,排队,延迟,记录日志
2023-01-31
项目需求:
不同业务的数据结构不同,树形结构,
但不同的层级,相应的层级属性构成不一样,
而且还有不同的逻辑处理在层级对象上.
解决记录:
先考虑了 visitor, double-dispath, 但针对每种业务对象, 所作的处理会在同一个 VISITOR 对象中。想把针对不同业务对象树的操作分离到它自己的类.
根据:<Agile PPP> Extension Object 模式:
不改变类层次结构的情况下向其中增加功能, 虽复杂点,但功能更强大,更灵活一点。
层次结构中的每个对象都持有一个特定扩展对象(extension object) 的列表,同时,每个对象也提供一个通过名字查找扩展对象的方法。扩展对象
提供了操作原始层次结构对象的方法。


part
public abstract class Part { private final ConcurrentHashMap<PartExtensionType, PartExtension> partExtensionMap = new ConcurrentHashMap<>(); public abstract String getPartNumber(); public abstract String getDescription(); public void addExtension(PartExtensionType extensionType,PartExtension partExtension){ partExtensionMap.putIfAbsent(extensionType,partExtension); } public PartExtension getPartExtension(PartExtensionType extensionType){ return this.partExtensionMap.getOrDefault(extensionType,new BadExtensionDefault()); } }
public enum PartExtensionType { EXTENSION_TYPE_XML, EXTENSION_TYPE_CSV }
public class Assembly extends Part { private final String partNumber; private final String description; private final List<Part> parts = new CopyOnWriteArrayList<>(); public Assembly(String partNumber, String description){ this.partNumber = partNumber; this.description = description; } @Override public String getPartNumber() { return this.partNumber; } @Override public String getDescription() { return this.description; } public List<Part> getParts(){return this.parts;} }
public class PiecePart extends Part { private final String partNumber; private final String description; private final double cost; public PiecePart(String partNumber, String description, double cost) { this.partNumber = partNumber; this.description = description; this.cost = cost; addExtension(PartExtensionType.EXTENSION_TYPE_XML,new XMLPiecePartExtension(this)); addExtension(PartExtensionType.EXTENSION_TYPE_CSV,new CSVPiecePartExtension(this)); } @Override public String getPartNumber() { return this.partNumber; } @Override public String getDescription() { return this.description; } public double getCost(){ return this.cost; } }
extension part ( mark interface )
public interface PartExtension { }
public interface XMLPartExtension extends PartExtension { Object getXMLElement(); }
public class XMLAssemblyExtension implements XMLPartExtension { private final Assembly assembly; public XMLAssemblyExtension(Assembly assembly){ this.assembly = assembly; } @Override public Object getXMLElement() { // 1. 先基于 Assembly 自身属性构建 XMLNode // 2. 遍历 Assembly 子节点集合构建 XML Children Node List<Object> mockXMLChildren = new ArrayList<>(); assembly.getParts().forEach(child->{ PartExtension partExtension = child.getPartExtension(PartExtensionType.EXTENSION_TYPE_XML); XMLPartExtension xmlPartExtension = (XMLPiecePartExtension)partExtension; Object childXmlObj = xmlPartExtension.getXMLElement(); mockXMLChildren.add(childXmlObj); }); // 组装为一个完整的 assemblyXMLNode return null; } }
public class XMLPiecePartExtension implements XMLPartExtension{ private final PiecePart part; public XMLPiecePartExtension(PiecePart part){ this.part = part; } @Override public Object getXMLElement() { // 基于 PiecePart 的属性 来构造 xml element return new Object(); } }
创建 - extension object . composite

2023-04-11
今日在项目开发中,因为一个流程的结果对象有两种状态,
两种不同类的属性, 作为后续分流的信息。联想到 State 模式,但遗忘。做下笔记
有限状态自动机是软件宝库最有用的抽象之一.提供了一个简单优雅的方法定义复杂系统的行为。
也提供了一个易于理解,易于修改的有效实现策略。

其内部状态的改变,是由实例 currentState 在两种不同的状态实例切换来实现的。
2023-04-172023-04-17
JdbcTemplate
将过程与特定特定实现相关的部分委托给接口,而这个接口的不同实现定义了过程中的具体行为. 模板方法模式。
Spring 将数据访问过程中固定的和可变的部分明确划分为两个不同的类:模板 template 和 回调 callback。
数据访问固定部分--事务控制,管理资源以及处理异常 模板
应用程序相关的数据访问--语句,绑定参数以及数据整理结果集--在回调的实现中实现.

浙公网安备 33010602011771号