随笔分类 -  设计模式

摘要:迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露对象的内部表示。迭代器抽象类: 1 package iterrator; 2 3 public abstract class Iterator { 4 public abstract Object first(); 5 6 public abstract Object next(); 7 8 public abstract boolean isDone(); 9 10 public abstract Object currentItem();11 }聚合对象抽象类:1 public ab... 阅读全文
posted @ 2012-11-01 15:16 寒剑飘香 阅读(134) 评论(0) 推荐(0)
摘要:组合模式,将对象组合成树形结构以表示‘部分-整体’的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认方法。声明一个接口用于访问和管理Component的子部件。 1 package group; 2 3 public abstract class Component { 4 protected String name; 5 6 public Component(String name) { 7 this.name = name; 8 } 9... 阅读全文
posted @ 2012-11-01 11:40 寒剑飘香 阅读(157) 评论(0) 推荐(0)
摘要:备忘录这个名词,相信我们已经很熟悉了,比如word里面有撤销操作的功能,打游戏时我们可以保存进度等等,在软件设计中,也会用到备忘录。 备忘录,在不破坏封装性的前提下,捕获一个对象的内部状态,并在改对象之外保存这个状态,这样以后就可以将该对象恢复到原先的状态。 我们来看代码,首先是原始的类,里面有一个状态属性state,并且可以决定创建备忘录和恢复备忘录: 1 package beiwanglu; 2 3 public class Originator { 4 private String state; 5 6 public Memento createMem... 阅读全文
posted @ 2012-10-31 12:08 寒剑飘香 阅读(204) 评论(0) 推荐(0)
摘要:适配器模式,将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一同工作。 在软件开发中,系统的数据和行为都正确,但是接口不符时,我们应该考虑使用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配,适配器主要用于希望复用一些现有的类,但是接口又与复用环境要求不一致的情况。 我们看代码: 首先是target类,也就是客户需要的类,里面有一个方法是request() 1 package adapter;2 3 public class Target {4 public void request(){5 ... 阅读全文
posted @ 2012-10-31 11:39 寒剑飘香 阅读(162) 评论(0) 推荐(0)
摘要:状态模式,当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。 状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的问题简单化。 状态类: 1 package state; 2 3 public interface IState { 4 void call(Context context); 5 //其他操作 6 } 7 8 public class WaitState implements IState{ 9 10 @Override11 p... 阅读全文
posted @ 2012-10-30 15:30 寒剑飘香 阅读(204) 评论(0) 推荐(0)
摘要:我们设想这样一个场景,我们在最初做项目的时候数据库访问层使用的是mysql,但是突然有一天临时决定要使用access,于是,由于二者在很多方面的不同,我们需要修改实现类,而且不止一个方法需要修改。这样是不是很麻烦呢?加入以后又要使用别的数据库呢?所以我们引入了抽象工厂模式。 抽象工厂模式,提供一个创建一系列相关或者相互依赖对象的接口,而无需指定他们具体的类。 AbstractProductA和AbstractProductB是两个抽象产品,之所以是抽象的,是因为他们可能有不同的实现。 阅读全文
posted @ 2012-10-30 11:50 寒剑飘香 阅读(186) 评论(0) 推荐(0)
摘要:观察者模式,又叫发布-订阅模式。 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有的观察者对象,使他们能够自动更新自己。 我们来看具体的代码实现,首先是抽象的通知者以及他的实现类: 1 package observer; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public abstract class Subject { 7 private List<Observer> observers = new ArrayL... 阅读全文
posted @ 2012-10-29 12:02 寒剑飘香 阅读(256) 评论(0) 推荐(0)
摘要:如果需要将一个复杂对象的构建与它的表示层分离,使得同样的构建过程可以创建不同的表示的意图时,我们就需要用到建造者模式了,又叫生成器模式。建造者模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同内部表象的产品对象。如果我们使用了建造者模式,那么用户只需要指定需要建造的类型就可以得到他们,而具体的建造过程和细节就不需要知道了。 我们来看建造者模式的概念,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 那么,什么时候需要建造者模式呢? 它主要是用于创建一些复杂的对象,这些对象内部构建间的建造顺序通常是稳定的,但对象内部的构建... 阅读全文
posted @ 2012-10-26 11:29 寒剑飘香 阅读(181) 评论(0) 推荐(0)
摘要:外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 我们来看具体的代码实现: 三个子系统类: 1 package facade; 2 3 public class SubSystemOne { 4 public void methodOne() { 5 System.out.println("子系统方法一"); 6 } 7 } 8 9 public class SubSystemTwo {10 public void methodTwo() {11 ... 阅读全文
posted @ 2012-10-26 10:49 寒剑飘香 阅读(207) 评论(0) 推荐(0)
摘要:今天是小菜开博的第三天,感觉挺好的,每天都能学习一些东西,生活过的很充实,一定要坚持下去。 今天,我们要学习的是程序设计中的一些原则。 一、单一职责原则,就一个类而言,应该仅有一个引起它变化的原因。 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会抑制或者削弱这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当发生变化时,设计会遭受到意想不到的破坏。 二、开放封闭原则,是说软件实体(类、模块、函数等等)应该可以扩展,但是不可以修改。 面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。 我们希望的是在开发工作展开不久,就可以知道可能发... 阅读全文
posted @ 2012-10-25 15:29 寒剑飘香 阅读(436) 评论(0) 推荐(0)
摘要:模板方法模式,当我们要完成在某一细节层次一致的一个过程或者一系列步骤,但其个别步骤在更详细的层次上的实现有可能不同时,我们通常考虑使用模板方法模式来处理。 我们来看模板方法模式的定义,定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 下面是具体的代码块: 1 package template; 2 3 public abstract class AbstractClass { 4 public abstract void primitiveOperation1(); 5 6 publ... 阅读全文
posted @ 2012-10-25 12:18 寒剑飘香 阅读(137) 评论(0) 推荐(0)
摘要:java“指针” Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念。并且由于Java不能通过简单的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象。本文会让你了解什么是影子clone与深度clone,认识它们的区别、优点及缺点。看到这个标题,是不是有点困惑:Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于使用早已臭名昭著的"GOTO"语句。Java放弃指针的概念绝对是 阅读全文
posted @ 2012-10-25 11:28 寒剑飘香 阅读(284) 评论(0) 推荐(0)
摘要:今天我们要学习的第一种设计模式是原型模式。 比如,我们需要三份同样的简历,简历里面包含姓名,性别,工作经历,我们可能会实例化三个简历对象。但是如果我们需要100份简历呢?我们是不是还得实例化100个简历对象呢?这样做好像有点麻烦。 那么就引入原型模式的概念了,原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 而在java中,一个对象如果想要被克隆,需要实现Clonable接口,并复写clone()方法。 要被克隆的对象类: 1 package prototype; 2 3 public class ConcretePrototype implemen... 阅读全文
posted @ 2012-10-25 11:27 寒剑飘香 阅读(173) 评论(0) 推荐(0)
摘要:前面我们学习过简单工厂模式,它简化了对象的创建,使得客户端调用时传入标志量,那么调用工厂就可以生产出相应的对象。那么工厂方法模式和简单工厂模式有什么区别呢? 我们还是拿前面运算类来举例子,我们先看简单工厂模式下的实现。 这个我们很熟悉了,创建一个抽象的运算类,提供公用的属性和方法以供继承,然后加减乘除四个子类继承自运算类。创建一个简单工厂类,根据客户端的标志量来生产出相应的运算类。 然后我们来看工厂方法的实现。 直观来看,工厂方法模式想比较简单工厂模式,它对工厂类又进行了抽象,简单工厂是用工厂去生产实例,而工厂方法则先构造相应的工厂,然后用工厂生产实例。 这其实就是简单工... 阅读全文
posted @ 2012-10-24 12:19 寒剑飘香 阅读(174) 评论(0) 推荐(0)
摘要:代理模式大家都已经比较熟悉了,很多框架中也用到了代理模式。下面我们直接介绍代理模式。 代理模式,为其他对象提供一种代理以控制对这个对象的访问。 Subject类,定义了被代理对象和代理公用的接口,这样代理就可以使用了。 1 package proxy;2 3 public abstract class Subject {4 public abstract void request();5 } RealSubject类,定义Proxy代表的真实实体 1 public class RealSubject extends Subject{2 @Override3 ... 阅读全文
posted @ 2012-10-24 11:36 寒剑飘香 阅读(144) 评论(0) 推荐(0)
摘要:装饰模式,动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 我们来看基本的代码实现: Component类: 1 package decorator;2 3 public abstract class Componnent {4 public abstract void operation();5 } ConcreatComponent类: 1 public class ConcreatComponent extends Componnent{2 3 @Override4 public void operation() ... 阅读全文
posted @ 2012-10-24 11:22 寒剑飘香 阅读(142) 评论(0) 推荐(0)
摘要:顾名思义,我们来想象这样一个场景。商场有很多种打折方式,比如最近京东的满300送100,全场五折等等,商家销售的方式多种多样,如果我们用这样的场景来建模,你会怎么做呢?我们已经了解过了简单工厂模式,或许我们可以用简单工厂模式,抽象出一个用于计算最终消费者需要花多少钱的方法,然后对各种打折方式进行实现,增加一个工厂,根据客户端传递过来的标志量对打折方式的实例进行生产。这样做固然可以,但是我们可以想到,商家的打折方式是不确定的,可能今天采用这种打折方式,明天又会换一种打折方式,那么我们是不是得频繁修改这个工厂类呢? oh,no。这样做显然是糟糕的,虽然可以实现,但是它应该不是好的实现方式,那... 阅读全文
posted @ 2012-10-23 12:17 寒剑飘香 阅读(175) 评论(0) 推荐(0)
摘要:在设计模式中需要涉及到UML类图的知识,所以在这里我们就简单了解一下UML类图中各种符号所代表的含义。 我们先看一张图,基本包含了UML类图的各种符号,然后一一做解释: 我们首先看动物那个矩形框,类图分三个层次:第一层显示类的名称,如果是抽象类,就用斜体表示;第二层是类的属性,通常就是字段和属性;第三层是类的操作,通常就是方法或行为,注意前面的符号,+表示public,-表示private,#表示protected。 注意左下角飞翔,表是一个接口,与类图的区别是顶端有<<interface>>,第一行是接口名称,第二行是接口方法。接口还有一种表示方法,俗称棒棒糖表示方法 阅读全文
posted @ 2012-10-23 11:41 寒剑飘香 阅读(1060) 评论(0) 推荐(0)
摘要:小菜工作一年多了,以前写代码很少关注设计模式的事情,一来没有系统的学习过设计模式,二来无论是项目还是产品的架构都是公司的牛人做的,自己也不用考虑这方面的东西,但是随着工作的深入,越来越觉得设计模式的重要性。面向对象的开发即继承、多态、封装,但是在面对比较复杂的项目或者产品时,好的设计模式更能体现或者说更好的实现面向对象编程的思想,所以从今天开始,小菜决定系统的学习下设计模式,和大家分享。 首先学习的是大家都熟知的简单工厂模式,我们先来看看简单工厂模式的UML类图: 从UML类图上我们可以看出,所有的运算类都继承自一个共同的父类,在父类中,提供了运算的方法,子类做具体的实现并返回结果... 阅读全文
posted @ 2012-10-23 11:14 寒剑飘香 阅读(233) 评论(0) 推荐(0)