雪一更--软件开发--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。

数据访问固定部分--事务控制,管理资源以及处理异常 模板

应用程序相关的数据访问--语句,绑定参数以及数据整理结果集--在回调的实现中实现.

 

posted @ 2023-01-14 12:01  君子之行  阅读(12)  评论(0)    收藏  举报