好的设计的特点:高内聚、松耦合、封装、单一职责、可扩展、易读。这些设计的要求可以通过设计模式来解决。
设计模式只是为了达到良好设计的一个方法。按照敏捷的思想,简单设计是目标。不要臆想未来的可能而使用设计模式。当代码有坏味道,且当使用设计模式可以解决这些问题,那么使用设计模式;当需求的变化不满足目前设计要求或者使当前代码无法有良好的扩展性、松耦合、消除重复代码,那么使用设计模式。 在软件设计中不见得一定使用设计模式,不要为了使用设计模式而使用设计模式,所以设计模式是设计的核心就谈不上了。 设计的核心是解决实际问题,且使设计具有良好的松耦合、扩展性、共用代码,满足开闭原则等。
几位大师对使用设计模式的看法:
- 找出变化并封装之。
- 优先使用对象聚集,而不是类继承。
1、Facade模式
Facade模式是对外界提供一个简洁的统一的接口,降低与外界的耦合度。
系统间或者包间的依赖尽可能少,外耦合内聚合是系统设计的原则。
领域驱动建模中,对系统的分层,dao层、领域层、服务层,其中的服务层其实就是facade层,是放置事务的合适位置,
领域层的粒度是比较小的,为达到更好的复用性,而在服务层可能会调用领域层的多个接口,而且多个接口可能构成一个业
务操作,构成一个事务。
2、代理模式与装饰模式
代理模式通常是对原有对象的控制,不会增加新的行为,比如说原来干什么还是干什么,常见的比如cglib加上事务机制,加上访问的控制但是没有增加新的行为,原有的服务未变。
但是装饰模式通常会加上新的行为,而且行为可以动态进行组合,可以有任意顺序,比如给墙刷颜色,先刷底色,再刷红色,再刷绿色,也可以先刷底色,再刷绿色,再刷红色。
代理模式和装饰模式都可以构造成在新类中引用对原有类,构成原有类的委托,这样就可以对原有类进行控制了,可以加新的行为,也可以加上其他控制。
代理模式也可以不构造成对原有接口的引用,比如采用动态代理,而装饰模式一般就是采用对原有接口的引用。
代理模式一般只对原有接口包装一次,而装饰模式可以对原有的接口包装多次
代理者和被代理者是聚合关系吗??聚合关系是整体和局部的关系,但是离开整体局部还可以生存,比如飞机场和飞机,代理模式两者关系,我觉得应该是依赖关系,更像是user-a关系
3、command模式
command模式很可能非常简单,很可能就是一个接口一个do方法,通常用于do或者undo场景。如果你认为应用场景中可以把一个动作封装起来,那么可以考虑使用命令模式。
public interface command{ void do(); }
但是其本质就是对动作或者请求的封装,对调用者和实现者解耦,比如说有很多开关,我们要对所有的开关执行开动作或者关的动作,调用者执行调用动作;而每个开关所要做的事情就是动作逻辑。调用动作通过一个do()或者undo方法可以使所有的开关执行开或者关动作。command模式通常会把动作和接受者绑定在一起,比如开的动作和灯绑定在一起
public class LightCommand {
private Light light;
public void open(){
this.light.open();
} 。。。。。}要有几个角色
(1)调用者
(2)命令本身
(3)接受者
命令模式封装了不同的任务或者动作的接受者,使得调用者和真正地执行者进行了解耦,也就是说,调用者可以动态替换command,或者调用者根本就不知道接收者是谁??就像一个按钮控制板,控制台灯,也控制电视,使用命令模式,接受者是电视、台灯分别实现了command的interface,控制面板点击某个按钮只需要注入不同的command就可以了。
3、策略模式与模板模式
策略模式是采用接口抽象算法,而模板模式是定义好算法的结构,采用继承。
4、状态模式与策略模式
策略模式与状态模式的结构很相似,但是状态模式的每个状态往往要引用一个context。
状态模式几个状态对某些动作或者几个事件的处理
未完 待续