1.每个概念一个词
CRUD操作 方法名约定
新增 create
添加 add
删除 remove
修改 update
查询(单个结果) get
查询(多个结果) list
分页查询 page
统计 count
2.使用对账词
add/remove
increment/decrement
open/close
begin/end
insert/delete
show/hide
create/destroy
lock/unlock
source/target
first/last
min/max
start/stop
get/set
next/previous
up/down
old/new
3.后置限定词
一组非常优雅,具有对成型的变量命名,
例如revenueTotal(总收入),expenseTotal(总支出),revenueAverage(平均收入)和expenseAverage(平均支出)
4.显性化错误码
对于错误类型,我们可以做一个约定:P代表参数异常(ParamException),B代表业务异常(BizException),S代表系统异常(SystemException)
错误类型 错误码约定 举例
参数异常 P_XX_XX P_Customer_NameIsNull:客户姓名不能为空
业务异常 B_XX_XX B_Customer_NameAlreadyExist:客户姓名已存在
系统异常 S_XX_XX S_Unknow_Error:未知系统错误
5.GoF
1.创建型模式:用于描述“怎么样创建对象”,主要特点是“将对象的创建与使用分离”.GoF中提供了单例,原型,工厂方法,抽象工厂,建造者5种创建型模式.
2.结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF中提供类代理,适配器,桥接,装饰,外观,享元,组合7种结构型模式
3.行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,以及怎样分配职责.GoF种提供类模板方法,策略,命令,职责链,状态,观察者,中介者,迭代器,访问者,备忘录,解释器11种行为型模式.
GoF23种设计模式的分类,简要介绍如下
1.单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点,以便外部获取该实例,其拓展是有限多例模式.
2.原型(Prototype)模式:将一个对象作为原型,通过对其进行复制操作而复制出多个和原型类似对新实例
3.工厂方法(Factory Method)操作:定义一个用于创建产品对接口,由子类决定生产什么产品
4.抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关对产品
5.建造者(Builder)模式:将一个复杂对象分解成多个相对简单的部分,然后根据不同的需要分别创建它们,最后构建成该复杂对象
6.代理(Proxy)模式:为某对象提供一种代理以控制对该对象的访问,即客户端通过代理间接地访问该对象,从而限制,增强或修改该对象的一些特性.
7.适配器(Adapter)模式:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作.
8.桥接(Bridge)模式:将抽象与实现分离,使它们可以独立变化.它是用组合关系代替继承关系来实现的,从而降低了抽象和实现者两个可变维度耦合度.
9.装饰(Decorator)模式:动态地给对象增加一些职责,即增加其额外的功能.
10.外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容器被访问.
11.享元(Flyweight)模式:运用共享技术来有效地支持大量细粒度的复用
12.组合(Composite)模式:将对象组合成树状层次结构,使用户对单个对象和组合对象具有一致对访问性
13.模版方法(TemplateMethod)模式:定义一个操作的算法骨架,将算法的一些步骤延迟到子类中,使子类可以在不改变该算法结构的情况下,重定义该算法的某些特定步骤
14.策略(Strategy)模式:定义来一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户.
15.命令(Command)模式:将一个请求封装成一个对象,使发出请求的责任和执行请求的责任分割开.
16.职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止.通过这种方式可以去除对象之间的耦合.
17.状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力.
18.观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,把这种改变通知给其他多个对象,从而影响其他对象对行为.
19.中介者(Mediator)模式:定一个中介对象来简化原有对象之间对交互关系,降低系统中对象间对耦合度,使原有对象之间不必相互了解
20.迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中对一系列数据,而不暴露聚合对象对内部表示.
21.访问者(Visitor)模式:在不改变集合元素对前提下,为一集合中对每个元素提供多种访问方式,即每个元素有多个访问者对象访问.
22.备忘录(Memento)模式:在不破坏封装性对前提下,获取并保存一个对象对内部状态,以便以后恢复它.
23.解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子对解释方法,即解释器.
需要注意对是,这23种设计模式不是孤立存在对,很多模式之间存在一定的关联关系,在大型系统开发种常常会同时使用很多设计模式
3个使用广泛的设计模式
1.拦截器模式
在拦截器模式中,主要包含以下角色:
TargetInvocation:包含来一组Interceptor和一个Target对象,确保在Target处理请求前后,按照定义顺序调用Interceptor做前置和后置处理
Target:处理请求的目标接口
TargetImpl:实现来Target接口的对象
Interceptor:拦截器接口
InterceptorImpl:拦截器实现,用来在Target处理请求前后做切面处理
我们可以按照下面的步骤实现一个拦截器模式
1.创建Target接口
public interface Target{
public Response execute(Request request);
}
2.创建Interceptor接口
public interface Interceptor{
public Response intercept(TargetInvocation targetInvocation);
}
3.创建TargetInvocation
public class TargetInvocation{
private List<Interceptor> interceptorList = new ArrayList<>();
private Iterator<Interceptor> interceptors;
private Target target;
private Request request;
public Response invoke(){
if(interceptors.hasNext()){
Interceptor interceptor = interceptors.next();
//此处是整个算法的关键,这里会递归调用invoke()
interceptor.interceptor(this);
}
return target.execute(request);
}
public void addInterceptor(Interceptor interceptor){
//添加新的Interceptor到TargetInvocation中
interceptorList.add(interceptor);
interceptors = interceptorList.iterator();
}
}
4.创建具体的Interceptor.
AuditInterceptor实现如下:
public class AuditInterceptor implements Interceptor{
@Override
public Response intercept(TargetInvocation targetInvocation){
if(targetInvocation.getTarget() == null){
throw new IllegalArgumentException("Target is null");
}
System.out.println("Audit Succeeded");
return targetInvocation.invoke();
}
}
public class LogInterceptor implements Interceptor{
@Override
public Response intercept(TargetInvocation targetInvocation){
System.out.println("Logging Begin");
Response response = targetInvocation.invoke();
System.out.println("Logging End");
return response;
}
}
5.使用InterceptorDemo来演示拦截器设计模式
public class InterceptorDemo{
public static void main(String[] args){
TargetInvocation targetInvocation = new TargetInvocation();
targetInvocation.addInterceptor(new LogInterceptor());
targetInvocation.addInterceptor(new AuditInterceptor());
targetInvocation.invoke();
}
}
6.执行程序,输出结果
2.插件模式
ExtensionPoint:扩展点,用来标识可以扩展的功能点
Extension:扩展,是对ExtensionPoint的扩展实现
PluginDescriptor:插件描述,即描述插件的元数据,定义了包括对外暴露对扩展点,运行插件所需要对依赖等信息.一个PluginDescriptor对应一个Plugin.xml配置
PluginRegistry:插件注册,用来进行插件注册和存储实例
PluginManager:插件管理,用来装载和激活插件实例.
Plugin:插件实例,当PluginManager调用activate方法激活Plugin时,就会产生一个Plugin实例
3.管道模式
6.DDD
我们要实现一个银行转账的功能,如果用传统的事务脚本方式实现,业务逻辑通常会被写在MoneyTransferService中,而Account仅仅是getters和setters的数据结构,也就是所谓的“贫血模式”.
public class MoneyTransferServiceTransactionScriptImpl implements MoneyTransferService{
private AccountDao accountDao;
private BankingTransactionRepository bankingTransactionRepository;
...
@Override
public BankingTransaction transfer(
String fromAccountId,String toAccountId,doule amount){
Account fromAccount = accountDao.findById(fromAccountId);
Account toAccount = accountDao.findById(toAccountId);
...
double newBalance = fromAccount.getBalance() - amount;
switch(fromAccount.getOverdraftPolicy()){
case NEVER:
if(newBalance < 0){
throw new DebitException("Insufficient funds");
}
break;
case ALLOWED:
if(newBalance < -limit){
throw new DebitException("overdraft limit ( of" + ") exceeded: " + newBalance);
}
break;
}
fromAccount.setBalance(newBalance);
toAccount.setBalance(toAccount.getBalance() + amount);
BankingTransaction moneyTransferTransaction = new MoneyTransferTransaction(fromAccountId,toAccountId,amount);
bankingTransactionRepository.addTransaction(moneyTransferTransaction);
return moneyTransferTransaction;
}
}
领域建模:Account实体除账号属性之外,还包含了行为和业务逻辑,比如debit()和credit()方法.
public class Account{
private String id;
private double balance;
private OverdraftPolicy overdraftPolicy;
...
public double balance(){return balance;}
public void debit(double amount){
this.overdraftPolicy.preDebit(this,amount);
this.balance = this.balance - amount;
this.overdraftPolicy.postDebit(this,amount);
}
public void credit(double amount){
this.balance = this.balance + amount;
}
}
透支策略OverdraftPolicy也不仅仅是一个Enum了,而是被抽象成包含业务规则并采用策略模式的对象.
public interface OverdraftPolicy{
void preDebit(Account account,double amount);
void postDebit(Account account,double amount);
}
public class NoOverdraftAllowed implements OverdraftPolicy{
public void preDebit(Account account,double amount){
double newBalance = account.balance() - amount;
if(newBalance < 0){
throw new DebitException("Insufficient funds");
}
}
public void postDebit(Account account,double amount){}
}
public class LimitedOverdraft implements OverdraftPolicy{
private double limit;
...
public void preDebit(Account account,double amount){
if(newBalance < - limit){
throw new DebitException("Overdraft limit (of " + limit + ") exceeded:" + newBalance);
}
}
public void postDebit(Account account,double amount){}
}
public class MoneyTransferServiceDomainModelImpl implements MoneyTranssferService{
private AccountRepository accountRepository;
private BankingTransactionRepository bankingTransactionRepository;
...
@Override
public BankingTransaction transfer(
String fromAccountId,String toAccountId,double amount){
Account fromAccount = accountRepository.findById(fromAccountId);
Account toAccount = accountRepository.findById(toAccountId);
...
fromAccount.debit(amount);
toAccount.credit(amount);
BankingTransaction moneyTransferTransaction = new MoneyTranferTransaction(fromAccount,toAccount,amount);
bankingTransactionRepository.addTransaction(moneyTransferTransaction);
return moneyTransferTransaction;
}
7.数据驱动和领域驱动
数据驱动:需求分析-数据建模(ER图)-建库建表,写DAO-编写业务逻辑
领域驱动:需求分析-领域分析-领域建模-核心业务逻辑-技术细节(DB,Cache,Message,...)
8.COLA架构设计
(1)展现层(Presentation Layer):负责以Rest的格式接受Web请 求,然后将请求路由给Application层执行,并返回视图模型(View Model),其载体通常是数据传输对象(Data Transfer Object,DTO)。
(2)应用层(Application Layer):主要负责获取输入、组装上下 文、做输入校验、调用领域层做业务处理,当需要时发送消息通知。当 然,层次是开放的,若有需要,应用层也可以直接访问基础实施层。
(3)领域层(Domain Layer):主要封装了核心业务逻辑,并通 过领域服务(Domain Service)和领域对象(Entities)的函数对外部提 供业务逻辑的计算和处理。
(4)基础设施层(Infrastructure Layer):主要包含数据访问通道 (Tunnel)、Config和Common。这里我们使用Tunnel这个概念对所有的 数据来源进行抽象,数据来源可以是数据库(MySQL、NoSQL)、搜 索引擎、文件系统,也可以是SOA服务等;Config负责应用的配置; Common是通用的工具类。
扩展设计
网友评论