本文主要是介绍合作开发之后谈设计模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在机房收费系统个人版中只用了一个抽象工厂加反射的设计模式,合作开发中要求尽可能的多用设计模式所以在原来的基础上又加了职责链、策略、模板、单例、外观等设计模式。设计模式每用一次都有不同的收获。这次就谈谈职责链跟模板方法模式吧!
职责链设计模式
当我们第一次接触一个新事物时,首先要知道的肯定是它的名字。比如认识一个人,知道了它的名字之后才进一步对其进行了解,然后再跟他的名字产生联系。再如第一次接触飞机时,肯定要知道的是它的名字—飞机,等接触飞机的时间一长就会明白他为什么被称为飞机,因为它是会飞的机器。那么职责链又为什么被称为职责链设计模式?
职责
职责链模式使多个对象都有机会处理请求 ,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。职责链设计模式中职责是其组成的一部分。职责,也就是在它要处理的是请求,职责链中的每一个对象把处理的这种请求当做自己的职责。
链
职责链中处理请求对象的个数肯定大于1,它使多个对象都有机会处理请求。所以他要求多个对象连续处理一个请求,首先第一个对象接收到请求判断该请求是不是处于它的职责内,如果是则处理,如果不是则向第二个处理对象传递,同样第三个、第四个。
如何抽象职责链
职责链模式的使用前提,首先需要用户提交一个请求,而这个请求需要多次判断,也就是说对这个请求的回应有多种情况,当满足条件1时得到结果1,满足条件2时得到结果2以此类推条件3、4…..,这种情况类似于程序中if …elseif… elseif …elseif…的判断语句。如何抽象职责链中的对象?抽象对象还是应该根据需求来进行抽象,由于职责链中每一个对象都担负自己的职责,所以对于职责链中的对象应该按其“职责“来对其进行抽取。
如何将处理同一请求的对象连成一条链
对于职责链,分析其职责抽象出满足其要求的多个对象只是完成了职责链的第一步,要完成职责链还需要将抽象出来的多个对象连成一条链。其原理是设计模式的依赖倒转原则,依赖于抽象而不是依赖于具体。首先定义一个处理请示的接口,接口中含有一个对象是对自身的引用(依赖于抽象)。然后是具体处理者类,处理它所负责的请求,可访问它的后继者(依赖倒转原则)。
类图
职责链模式的好处
当客户提交一个请求时,请求是沿链传递直至有一个对象负责处理它。这使得接收者和发送者都没有对方的明确信息,且链中的对象自己也不知道链的结构。结果是职责链可简化对象的互相连接,它们仅需保持一个指向其后继者的引用,而不需保持它所有的候选接收者的引用。也就是说可以随时随地的增加或修改处理一个请求的结构,增强了给对象指派职责的灵活性。
模板方法模式
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
什么是模板模式
模板方法模式,顾名思义就是实现某一类东西时提供一个不变的模板,整个模板作为一个框架,具体事务的实现都在这个框架中制作,而具体的实现可以不相同。例如制作桌子时可以做一个桌子模板,而这个模板就是有四个腿,一个桌面。拿四个腿和一个桌面作为制作桌子的模板,具体的制作如四个腿可以长、可以短可以是木质的也可以是其他材料的。这样做出来的桌子都具有一个桌面和四个腿,皆出自与一个模板。
为什么叫模板方法模式?
模板方法模式不仅仅是为了创建一个模板(框架),模板方法模式还要实现的是复用。就拿制作一批桌子来说,客户给出桌子模型桌子腿长,桌面尺寸都有一定的要求,而唯一不同的就是桌子的颜色。这时就可以用模板来实现那些没必要重复的操作如尺寸的把握,用模板制作出者批桌子后只需要在原来的基础上刷不同的漆即可。
模板方法模式是怎么实现的?
模板方法模式的实现主要用到的是面向对象继承、多态、封装三大特性中的继承跟多态。由于子类作为父类模板的具体实现继承了父类的算法的骨架和某些个别步骤的实现,所以当更详细的层次上的实现可能不同时,只需要在子类中重定义某些特定的步骤(方法重写),实现子类在父类的基础上多态的特性。
实例
/*** 桌子抽象模板类* @author dell**/
public abstract class AbstractDesk {/** 桌子腿制作要求*/
protected void Legs()
{System.out.print("四条长1米");
}
/** 桌子面制作要求*/
public abstract void Table();
/** 桌子制作模板*/
public void MakeTable(){Legs();Table();System.out.print("的桌子");}
}
/** 具体黑色桌子*/
public class BlackDesk extends AbstractDesk {@Overrideprotected void Legs() {// TODO Auto-generated method stubsuper.Legs();System.out.print("都是黑色,");}@Overridepublic void Table() {// TODO Auto-generated method stubSystem.out.print("桌面为黑色");}}
/** 具体红色桌子*/
public class RedDesk extends AbstractDesk {@Overrideprotected void Legs() {// TODO Auto-generated method stubsuper.Legs();System.out.print("都是红色,");}@Overridepublic void Table() {// TODO Auto-generated method stubSystem.out.print("桌面为红色");}}
/** 测试类*/
public class Test {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubRedDesk reddesk=new RedDesk();reddesk.MakeTable();BlackDesk blackdesk=new BlackDesk();blackdesk.MakeTable();}}
模板方法的使用场合和好处
模板方法模式是通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势的。也就提供了一个很好的代码复用平台。如果以后遇到这种情况:有一个过程需要执行,这个过程包括一系列步骤,整个过程从高层次看是一样的,但是每个步骤的具体细节不一样,这时我们就可以考虑这种模板方法模式了。即当不变的行为和可变的行为在类中混在一起的时候,不变的行为就会在子类中重复出现,这是通过模板方法模式把这些行为搬移到单一的地方实现(超类),而把不同的部分在子类实现,这就使子类摆脱了重复的不变行为的困扰。
这篇关于合作开发之后谈设计模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!