- 浏览: 6411 次
最新评论
文章列表
策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
下面以鸭子为例实现策略模式
package com.licong.strategy;
/*
* 超类,所有的鸭子都要继承此类
* 抽象了鸭子的行为:显示和鸣叫
*/
public abstract class Duck {
/*
* 鸭子发出叫声
* 通用行为,由超类实现
*/
public void quack(){
System.out.println("嘎嘎嘎");
}
/*
* 显 ...
状态模式(State)就是根据对象的状态不同,将有不同的行为。当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
状态模式使代码种复杂而庸长的逻辑判断语句问题得到了解决,而且具体状态角色将具体的状态和它对应的行为封装起来了,这使得增加一种新的状态变得十分简单。但是每一个状态对应一个具体的状态类,是结构分散,逻辑不是很清楚,阅读代码工作量会大一些。
// Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。
public class Context
{
private State ...
工厂方法模式,定义了一个创建对象的接口,由子类决定要实例化的类是哪一个,工厂方法让类的实例化推迟到子类。
简单工厂模式的区别是工厂方法是具体的,不需要推迟到子类。
抽象工厂方法模式,提供一个接口,用于创建相关依赖对象的家族,而不需要明确指定具体类。
下面以剪头发为例来实现工厂方法:
发型工厂
package com.sunny.project;
import java.util.Map;
/**
* 发型工厂
* @author Administrator
*
*/
public class HairFactory {
/**
* 根据类 ...
装饰模式(Decorator)就是使用被装饰的一个子类的实例,在客户端将这个子类的实例委托给装饰类。装饰模式是结成关系的一个替代方案。
装饰模式以对客户端透明的方式增添了对象的功能,其在与动态的给对象添加了责任,当然这里的继承便是静态的。
其中重要的地方时装饰对象和真实对象有相同的接口,这样客户端就可以和真是对象一样的交互方式和装饰对象交互,然后装饰对象把所有从客户端接收过来的请求全部转发给真是对象,然后在返还给客户端,这样装饰对象就可以再转发前或者以后添加一些附加功能而不影响对真是对象的操作,这样在不改变原有类的基础上,可以实现对于原有类的这种额外功能的实现,增强了程序的复用性。
同 ...
适配器模式定义:将一个类的接口,转化成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
最常见的例子是三孔插座和两孔插座的适配:
适配器模式的对象:
1.请求对象(手机)
2.适配器对象(带有两孔和三孔的插座)
3.需要适配的对象(三孔插座)
4.请求对象所需要的接口。(插座要有两孔)
class Program
2 {
3 static void Main(string[] args)
4 {
5 Mobile mobile = new Mobile();
6 ...
开放关闭原则
对扩展开放,对修改关闭。
即在添加功能的时候能够添加新的代码实现扩展(扩展软件实体的行为)而不需要修改原有的代码。
在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不对整个功能进行重构,并且需要原有代码经过重新测试。
想要达到这样的效果,我们需要使用接口和抽象类。
依赖倒置原则
这个是开闭原则的基础,细节应该依赖抽象。针对接口编程,依赖于抽象而不依赖于具体。
最少知识原则(单一职责原则)
遵循单一职责原的优点有:
可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简 ...
观察者模式(Observer)就是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都得到通知并被自动更新。
通过一个一个抽象的主题Subject保存了多个信息处理列表,可以添加多个观察者,实现即时的通知观察者最新动态然后分别派生子类对象对具体的消息和状态做出处理。
观察者模式的组成
抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通 ...
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
● 抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义 出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
● 具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处 ...
代理模式(Proxy)就是为其他对象提供一种代理以控制这个对象的访问,去掉了某些功能或者是增加了一些额外的服务。
常见代理模式有:
远程代理(remoteProxy)
虚拟代理(virtualProxy)
保护代理(protectProxy)
智能引用代理(smartre reference proxy)--日志处理,权限处理,事务处理。
代理分为两种类型,静态代理和动态代理。
下面以我们经常使用的智能引用代理举例子
首先以简单的静态代理为例写一个开车的代理类以记录开车的日志和开车的时间。
静态代理有2种实现方式,一种是继承一种是聚合。我们使用更容易扩展的聚合方式为例 ...
模式定义
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
模式理解
简单来说就是,模版中定好步骤并实现基本方法,子类实现特定方法。
需要注意的地方:模版方法需要使用final标记以防止其它方法对模版做改动,模版方法的基本实现需要标记为private使得其子类不能修改模版类的最基本实现,模版方法中可拓展实现需标记为抽象的并且为protected。使得只有子类才能实现其可变方法。
模式例子
以冲泡咖啡或茶为例,实现模版方法。
...
单列模式是设计模式中最简单的一个,他的设计原则是保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。
单列模式使用的注意事项
只有一个私有的构造函数,包含该类自身的静态私有对象,提供一个静态的公有的函数用于创建或获取它本身的静态私有对象。
单列模式的误区
对如此简单的一个模式,我曾经陷入了一个误区,就是无论在什么时候,只要涉及到使用某个不需要重复实例化的类的时候我都使用单列模式,然而这里有个更好的实现方法,那就是工具类(静态方法)即可完美解决这个问题。
单列模式的使用场景
那么单列模式到底该用在何处呢?虽然我个人还没有遇到适合 ...