【持续更新】简单记录一下常用的设计模式
2017-04-27 17:18
537 查看
设计模式
单例模式
Builder模式
原型模式
工厂方法模式
抽象工厂模式
策略模式
状态模式
责任链模式
解释器模式
命令模式
观察者模式
静态内部类
设置参数,return this
new 对象,传递参数
返回
重写clone()
浅拷贝:拷贝对象无法修改原型对象的字段,保证了安全性(除了引用型字段,多以也要拷贝引用性字段)
深拷贝: 对拷贝对象的引用型字段也要拷贝
抽身产品接口
具体产品类
抽象工厂类
具体工厂类:每一个产品不同组成不同具体工厂
面向接口编程,但是工厂类过多,不易拓展
策略的抽象
具体的策略实现
操作策略的具体实现
代码
抽象状态类或接口:设置状态下的行为
具体状态类或接口:不同状态不同行为
Context环境类
代码:
抽象处理者
抽象请求者
具体处理者
具体请求者
代码
抽象表达式,抽象的解释方法
终结符表达式
非终结符表达式
环境类Context
客户类Client
一般很少用
接收者,具体逻辑
命令抽象接口
具体命令
请求者
客户端
将请求封装成一个对象,从而使用不同请求把客户端参数化:取消、日志、事务
抽象主题,被观察者Observable
具体主题,Concrete Observable
抽象观察者,Obsever
具体观察者
对象间一种一对多的依赖关系,每当一个对象改变状态,则所有依赖于它的对象都会通知并被自动更新
代码:
单例模式
Builder模式
原型模式
工厂方法模式
抽象工厂模式
策略模式
状态模式
责任链模式
解释器模式
命令模式
观察者模式
设计模式
单例模式
Double Check Lockpublic static Singleton getInstance(){ if(mInstance == null){ synchronized(Singleton.class){ if(mInstance == null){ mInstance = new Singleton(); } } } retuen mInstance; }
静态内部类
public static Singleton getInstance(){ retuen SingletonHolder.sInstance; } private static class SingletonHolder{ private static final Singleton sInstance = new Singleton(); }
Builder模式
存储参数设置参数,return this
new 对象,传递参数
返回
原型模式
使用重写clone()
浅拷贝:拷贝对象无法修改原型对象的字段,保证了安全性(除了引用型字段,多以也要拷贝引用性字段)
深拷贝: 对拷贝对象的引用型字段也要拷贝
工厂方法模式
//抽象产品类 public abstract class Dialog(){ public abstract void show(); } public class DialogA extends Dialog{ @Override public void show(){ //showA } }
//抽象工厂 public abstract class Factory{ public abstract <T extends Dialog>T createDialog 4000 (Class<T> clazz); } public class DialogAFactory extends Factory{ public <T extends Dialog>T createDialog(Class<T> clazz){ Dialog dialog = null; try{ dialog = (Dialog)Class.forName(clazz.getName()).newInstance(); }catch(Exception e){ ... } return (T)dialog; } } //使用 public static void main(String[] args){ Factory factory = new DialogFactory(); DialogA a = factory.createDialog(DialogA.class); a.show(); }
抽象工厂模式
角色抽身产品接口
具体产品类
抽象工厂类
具体工厂类:每一个产品不同组成不同具体工厂
面向接口编程,但是工厂类过多,不易拓展
策略模式
角色策略的抽象
具体的策略实现
操作策略的具体实现
代码
//策略抽象接口 public interface CalculateStrategy{ int calculatePrice(int km); } //具体策略 public class BusStrategy implements CalculateStrategy{ @Override public int calculatePrice(int km){ //... return busPrice; } } //Context角色 public class Context{ private CalculateStrategy cs; public void seCalculateStrategy(CalculateStrategy cs){ this.cs = cs; } public int calculatePrice(int km){ return cs.calculatePrice(km); } public static void main(String[] args){ Context context = new Context(); context.setCalculateStrategy(new BusStrategy()); context.calculatePrice(15); } }
状态模式
角色抽象状态类或接口:设置状态下的行为
具体状态类或接口:不同状态不同行为
Context环境类
代码:
//抽象状态:定义行为 public interface UserState{ public void forward(); public void comment(); } //具体状态:已登录 public class LoginedState implements UserState{ @Override public void forward(){ //转发 } public void comment(){ //评论 } } //具体状态:未登录 public class LogoutState implements UserState{ @Override public void forward(){ //去登陆 } public void comment(){ //去登陆 } } //使用 public class LoginContext{ private UserState mUserState = new LogoutState(); private LoginContext(){} private static LoginContext mLoginContext = new LoginContext(); public static LoginContext getInstance(){ return mLoginContext(); } public void setState(UserState userState){ mUserState = userState; } public void forward(){ mUserState.forward(); } public void comment(){ mUserState.comment(); } }
责任链模式
角色抽象处理者
抽象请求者
具体处理者
具体请求者
代码
//抽象处理者 public abstract class AbstractHandler{ protect AbstractHandler nextHandler; public final void handleRequest(AbstractRequest request){ if(getHandlerLevel() == request.getRequestLevel()){ handleRequest(request); }else{ if(nextHandler != null){ nextHandler.handleRequest(request); }else{ System.out.println("All of handler can not handle the request"); } } } protected abstract int getHandlerLevel(); protected abstract void handleRequest(AbstractRequest request); } //抽象请求者 public abstract class AbstractRequest{ private Object obj; public AbstractRequest (Object obj){ this.obj = obj; } public Object getContent(){ return obj; } public abstract int getRequestLevel(); } //具体处理者 public class Handler1 extends AbstractHandler{ @Override protected int getHandleLevel(){ return 1; } @Override protected void handleRequest(AbstractRequest request){ System.out.println("handler1 handle the request!"+request.getRequestLevel); } } //具体请求者 public class Request1 extends AbstractRequest{ public Request1(Object obj){ super(obj); } @Override public int getReqestLevel(){ return 1; } } //使用 public static void main(String[] args){ AbstractHandler handler1 = new Handler1(); AbstractHandler handler2 = new Handler2(); handler1.nextHandler = handler2; handler1.handlerRequest(new Request1("Request1")); }
解释器模式
角色抽象表达式,抽象的解释方法
终结符表达式
非终结符表达式
环境类Context
客户类Client
一般很少用
命令模式
角色接收者,具体逻辑
命令抽象接口
具体命令
请求者
客户端
将请求封装成一个对象,从而使用不同请求把客户端参数化:取消、日志、事务
观察者模式
角色抽象主题,被观察者Observable
具体主题,Concrete Observable
抽象观察者,Obsever
具体观察者
对象间一种一对多的依赖关系,每当一个对象改变状态,则所有依赖于它的对象都会通知并被自动更新
代码:
//具体主题 public class Website extends Observable{ public void postNewPublication(String content){ setChanged(); notifyObserver(content); } } //具体观察者 public class Subscriber extends Observer{ @Override public void update(observable 0,Object content){ System.out.println("更新的内容是:"+content); } } //使用 main: Website web = new Website(); Subscriber sub = new Subscriber(); web.addObserver(sub); web.postNewPublication("内容更新了!");
相关文章推荐
- 简单介绍一下 设计模式在android中运用
- 设计模式学习日记二(持续更新)
- 前台设计——常用HTML代码(持续更新)
- java 设计模式浅析(持续学习更新)
- Java设计模式汇总,持续更新中
- 简单小知识 记录一下 慢慢更新积累
- java 基础问题的一些处理,记录一下,持续更新呗
- 九种常用设计模式的简单应用
- 常用通讯术语记录(持续更新中)
- cocos2d-js游戏设计常用函数笔记(持续更新) (2014-08-18 15:43:12)
- C#设计模式中细节总结-持续更新中
- Linux常用命令及工具记录(持续更新)
- 项目中用到的设计模式(持续更新)
- Android源代码涉及的设计模式,持续更新
- 请用代码简单描述一下Singleton、抽象工厂、Bridge、Composite(任选三个)的设计模式的概念
- 【设计模式和面向对象设计】拾零(持续更新,个人零散笔记)
- linux mysql 运维一些常用记录(持续更新中...)
- java几种常用设计模式简单示例
- java几种常用设计模式简单示例
- linux常用工具记录__持续更新