命令模式
个人博客
http://www.milovetingting.cn
命令模式模式介绍命令模式是行为型设计模式之一。
模式定义将请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排除或者记录请求日志,以及支持可撤销操作。
使用场景
需要抽象出待执行的动作,然后以参数的形式提供出来
在不同的时刻指定、排列和执行请求。
需要支持取消操作。
支持修改日志功能。
需要支持事务操作。
简单使用定义命令接收者,即执行者
1234567891011public class Receiver { /** * 真正执行具体命令的方法 */ public void action() { System.out.println("执行具体的操作"); }}
定义命令的接口类
12345678public interface Command { /** * 执行具体操作的命令 */ public void execute();}
定义命令的实现类
1234567891011121314 ...
解释器模式
个人博客
http://www.milovetingting.cn
解释器模式模式介绍解释器模式是一种用得比较少的行为型模式,其提供了一种解释语言的语法或表达式的方式,该模式定义了一个表达式接口,通过该接口解释一个特定的上下文。
模式定义给定一个语言,定义它的方法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
使用场景
如果某个简单的语言需要解释执行而且可以将该语言中的语句表示为一个抽象语法树时,可以考虑使用解释器模式。
在某些特定的领域出现不断重复的问题时,可以将该领域的问题转化为一种语法规则下的语句,然后构建解释器来解释该语句。
简单使用略…
小结优点
灵活的扩展性。当我们想对方法规则进行扩展延伸时,只需要增加相应的非终结符解释器,并在构建抽象语法树时,使用到新增的解释器对象进行具体的解释即可。
缺点
因为对于每一条方法都可以对应至少一个解释器,其会生成大量的类,导致后期维护困难,同时,对于过于复杂的方法,构建抽象语法树会显得异常烦琐,甚至有可能会出现需要构建多棵抽象语法树的情况,因些,对于复杂的文档并不推荐使用解释器模式。
责任链模式
个人博客
http://www.milovetingting.cn
责任链模式模式介绍责任链模式是行为型设计模式之一。
模式定义使多个对象都有机会处理请求,从而避免了请求的发送者和接收者间的耦合。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
使用场景
多个对象可以处理同一请求,但具体由哪个对象处理则在运行时动态决定。
在请求处理者不明确的情况下向多个对象的一个提交请求。
需要动态指定 组对象处理请求。
简单使用定义抽象请求类
12345678910111213141516171819202122232425public abstract class AbstractRequest { /** * 处理对象 */ private Object obj; public AbstractRequest(Object obj) { this.obj = obj; } /** * 获取处理对象 * @return */ public Object getContent() { return obj; ...
位运算的简单应用-权限管理
个人博客
http://www.milovetingting.cn
位运算的简单应用-权限管理位运算在实际的开发中,有很多巧妙的应用场景。如:
一个存放正整数的数组,里面有一个数字只出现一次,其它数字都出现两次,求只出现一次的数字。
不用临时变量,交换两个数字的值。
Android中Window设置Flag
123456public void setFlags(int flags, int mask) { final WindowManager.LayoutParams attrs = getAttributes(); attrs.flags = (attrs.flags&~mask) | (flags&mask); mForcedWindowFlags |= mask; dispatchWindowAttributesChanged(attrs); }
产品具有某些Feature,这些Feature可以利用位运算来存储。
下面利用位运算来简单模拟权限管理
权限管理类
12345 ...
状态模式
个人博客
http://www.milovetingting.cn
状态模式模式介绍状态模式中的行为是由状态来决定的,不同状态下有不同的行为。
模式定义当一个对象的内在状态改变时允许其改变行为。
使用场景
一个对象的行为取决于它的状态,并且它必须在运行时根据状态来改变行为。
代码中包含大量与对象状态有关的条件语句。
简单使用定义状态接口
123456public interface TvState { public void nextChannel(); public void prevChannel(); public void turnUp(); public void turnDown();}
定义实现类
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647public class PowerOnState implements TvState { @Override public void nextChannel() & ...
策略模式
个人博客
http://www.milovetingting.cn
策略模式模式介绍实现某一个功能有多种算法或者策略,可以根据实际情况选择不同的算法或者策略来实现该功能,如果将这些算法或者策略抽象出来,提供一个统一的接口,不同的算法或策略有不同的实现类,这样在程序客户端就可以通过注入不同的实现对象来实现算法或者策略的动态替换,这种模式的可扩展性,可维护性更高。这就是策略模式。
模式定义策略模式定义了一系列的算法,并将每一个算法封装起来,使他们可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
使用场景
针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
需要安全地封装多种同一类型的操作时
出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时。
定义策略接口类
12345public interface Strategy { int calc();}
定义具体的策略实现类
12345678910111213141516171819public class Strategy1 implements S ...
抽象工厂模式
个人博客
http://www.milovetingting.cn
抽象工厂模式模式介绍抽象工厂模式,也是创建型设计模式之一。
模式的定义为创建一组相关或者相互依赖的对象提供一个接口,而不需要指定它们的具体类。
使用场景一个对象族有相同的约束时可以使用抽象工厂模式。如,Android,ios都有短信软件和拨号软件,两者都属于软件的范畴,但它们所在的操作系统平台不一样,这时可以使用抽象工厂模式来实现。
简单实现抽象产品类
1234567891011public abstract class AbstractProductA { public abstract void method();}public abstract class AbstractProductB { public abstract void method();}
抽象工厂类
1234567public abstract class AbstractFactory { public abstract AbstractProductA createProductA ...
工厂方法模式
个人博客
http://www.milovetingting.cn
工厂方法模式模式介绍工厂方法模式是创建型设计模式之一。
模式定义定义一个用于创建对象的接口,让子类决定实例化哪个类。
使用场景在任何需要生成复杂对象的地方,都可以使用工厂方法模式。用new就可以完成创建的对象无需使用工厂方法模式。
简单实现定义抽象类Product
12345678public abstract class Product { /** * 抽象方法,具体由子类实现 */ public abstract void method();}
定义实现类ProductA,ProductB
1234567891011121314151617public class ProductA extends Product { @Override public void method() { System.out.println("productA:method"); }}public class ProductB extends P ...
原型模式
个人博客
http://www.milovetingting.cn
原型模式模式介绍原型模式是一个创建型的模式。多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例,可使程序运行更高效。
模式定义用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。
使用场景
类初始化需要消耗非常多的资源
通过new产生一个对象需要非常繁琐的数据准备或访问权限
一个对象需要提供给其它对象访问,而且各个调用者可能都需要修改值
通过实现Cloneable接口的原型模式在调用clone函数构造实例时,并不一定比通过new操作速度快,只有当通过new构造函数对象较为耗时或成本较高时,通过clone方法才能够获得效率上的提升。
简单实现以简单的文档拷贝为例演示简单的原型模式。
先来演示浅拷贝
文档定义
123456789101112131415161718192021222324252627282930313233343536373839public class Document implements Cloneable { private String ...
Builder模式
个人博客
http://www.milovetingting.cn
Builder模式模式介绍Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构建流程。该模式是为了将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示隔离开来。
模式定义将一个复杂对象的构建与它的表示分离,使得同样的构建可以创建不同的表示。
使用场景
相同的方法,不同的执行顺序,产生不同的事件结果时。
多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时。
产品类非常复杂,或者产品类中的调用顺序不同产生了不同的作用。
当初始化一个对象特别复杂,如参数多,且很多参数都具有默认值时。
模式的简单实现Computer类
123456789101112131415161718public class Computer { private String mCpu; private String mScreen; private String mHd; public Computer(String cpu, Str ...