文档章节

Java开发中常用的设计模式

kukudeku
 kukudeku
发布于 2016/10/09 12:52
字数 1832
阅读 307
收藏 1

1.使用设计模式的好处

    从设计模式的概念中可以看出。设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式使代码真正工程化,设计模式是软件工程的基石。

2.设计模式的分类

    总体来说设计模式有3类

  • 创建型模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式和原型模式(复制、克隆)
  • 结构性模式:适配器模式、装饰器模式、代理模式、桥接模式、享元模式、组合模式
  • 行为型模式:策略模式、观察者模式、命令模式、解释器模式、命令模式

3.Java中的设计模式示例

    3.1 普通工厂方法

        建立一个工厂方法,对实现了同一个接口的一些类进行实例的创建。

package org;

/**
 * @author kucs
 * 创建一个接口
 *
 */
public interface Sender {
	public void send();
}

package org;

public class MailSender implements Sender {

	@Override
	public void send() {
		// TODO Auto-generated method stub
		System.out.println("this ais mailSender");
	}

}

package org;

public class SmsSender implements Sender {

	@Override
	public void send() {
		// TODO Auto-generated method stub
		System.out.println("this is smsSender");
	}

}

package org;

public class SendFactory {
	public Sender produce(String type){
		if("mail".equals(type))
			return new MailSender();
		else if("sms".equals(type))
			return new SmsSender();
		else
			return null;
	}
}

package org;

public class FactoryTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SendFactory factory = new SendFactory();
		factory.produce("mail").send();
	}

}

    3.2 单例模式

    单例对象是一种常用的设计模式。在Java应用中,单例对象能保证一个JVM中,该对象只有一个实例存在。这样的模式的好处:

    在某些类创建比较频繁,对于一些大型的对象,这是一笔很大的开销

    省去了new操作符,降低了系统内存的使用频率,减轻GC压力

    单例模式示例:

package org;

public class Singleton {
	private Singleton(){
		//构造私有方法,防止被实例化
	}
	/**
	 * @author kucs
	 * 此处使用一个内部类来维护单利
	 *
	 */
	private static class SigletonFactory{
		private static Singleton instance = new Singleton();
	}
	/**
	 * 获取实例
	 * @return singleton
	 */
	public static Singleton getInstance(){
		return SigletonFactory.instance;
	}
	
	/**
	 * 如果该对象用于序列化,可以保证对象在序列化前后保持一致
	 * @return
	 */
	public Object readResolve(){
		return getInstance();
	}
}

这样的话,能保证整个程序只需创建一个实例。

-- 先写到这儿,下午有事儿……

    3.3 适配器(Adapter)模式

    3.3.1 适配器模式应用场景

    客户端(Client)就是需要调用我们代码的对象。通常,在代码已经存在的情况下编写客户端代码,开发人员可以采用模拟客户端的方式调用我们提供的接口对象。然而,客户端也可能与你的代码单独进行开发。在这样的情况下,会发现现有的类虽然提供了客户端需要的服务,却被定义为不同的方法名。这时,就需要运用适配器模式了。

    适配器模式的意图在于,使用不同接口的类所提供的服务为客户端提供它所期望的接口。

    3.3.2 接口适配

    当我们需要适配现有代码时,可能会发现客户端开发人员已经事先考虑到这种情况。开发人员为客户端使用的服务提供了接口。如图示,RequiredIntf接口声明了client类所要调用的requiredMethod()方法。在ExistingClass类中,则定义了usefulMethod()方法,它是client类需要的实现。若对ExistingClass类进行适配,满足客户端对象的需要,就可以编写一个继承自ExistingClass,并同时实现RequiredIntf接口的类,通过重写requiredMethod()方法将客户端的请求派给usefulMethod()方法。

    

    3.3.3 类与对象适配

    类与对象的适配,与接口适配类似。只是没有了RequiredIntf,而是有了RequiredClass类。

    3.3.4 适配器总结

    适配器模式使我们可以重用一个现有类,以满足客户端的需要。当客户端通过接口表达其需求时,通常可以创建一个实现了该接口的新类,同时使该类继承自现有类。这种方式即类的适配器,它能够将客户端的调用转换为对现有类的调用。

    当客户端没有指定它所需要的接口时,可以使用雷雨对象适配。可能需要创建一个新的客户端子类,它将使用现有类的实例。这种方式通过创建一个对象适配器,将客户端的调用指向现有类的实例。

    3.4 外观模式

    3.4.1 外观模式的应用场景

        外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并提高程序的可维护性。

        外观模式的意图:为子系统提供一个接口,便于它的使用。

    3.4.2 与各子系统间的通信

        外观模式为子系统中的一组接口提供了一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。引入外观模式后,客户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。各子系统键的通信机制

   

    3.4.3 Facade模式的优点

  • 对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得简单,与之关联的对象也很少
  • 实现了子系统与客户之间的松散耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
  • 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程。

    3.5 代理模式(proxy)

        普通对象可以通过公共接口完成自己所需完成的工作。然而,有些对象却由于某些原因无法履行自己日常的职责。例如有的对象加载时间过长,有的对象运行在其他的计算机上,或者需要拦截发送到对象的消息等。对于这些场景,我们可以引入代理对象,通过它承担客户端需要的职责,并将相应的请求转发给底层的目标对象。

        代理模式的意图:通过提供一个代理Proxy或者占位符来控制对该对象的访问。

    3.5.1 经典范例

        代理对象通常拥有一个几乎和实际对象相同的接口。它常常会控制访问,并将请求合理地转发给底层真正的实现。代理模式的一个经典范例是如何避免将较大的图像加载到内存中。假设应用程序中的图像存在于页面或者容器中,并且在初始状态

    

    

 

 

© 著作权归作者所有

上一篇: ActiveMQ使用教程
下一篇: Java对象复制
kukudeku
粉丝 121
博文 49
码字总数 121805
作品 0
杭州
程序员
私信 提问
python 与设计模式 ——工厂与单例

python 与设计模式 源码地址:[http://git.oschina.net/duoduo3_69/python_design_pattern][1] git checkout v001(这个版本与此篇博客相符) zarkpy里面运用了很多设计模式,以前一直很费解p...

duoduo3_69
2013/11/27
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
0
0
【synchronized底层原理之1】Monitor Object 设计模式

Monitor Object设计模式源于C++:被JDK开发人员借鉴到了Java中并且对Monitor Object设计模式进行了封装。所以Java程序员在开发层面上对Monitor Object设计模式是无感知的(指对Monitor Objec...

karma123
2018/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C 语言 二级指针的使用

#include <stdio.h>#include <stdlib.h>typedef struct node Node;struct node {int data;struct node* next;struct node* prev;};Node head;Node* insert(Node......

小张525
59分钟前
3
0
【大数据技术】——Hadoop(1)

什么是大数据 基本概念 《数据处理》 在互联网技术发展到现今阶段,大量日常、工作等事务产生的数据都已经信息化,人类产生的数据量相比以前有了爆炸式的增长,以前的传统的数据处理技术已经...

须臾之余
今天
9
0
比特币从地址逆向计算私钥

区块链 区块链简介 说到比特币,就不得不提区块链。那什么是区块链呢? 区块链本质是一个数据集,只不过数据的组织采用了比较特殊的方式,就是把数据拆分为一块一块的小数据集。 为什么要进行...

trayvon
今天
2
0
TypeScript……真香

写前端或者用 node 写命令行小工具一直采用的 es6 的语法,对于 TypeScript 则是秉持敬而远之的态度,毕竟团队中多推广一门语言所需要花费的精力都是让人望而却步的。所以对于 JavaScript 的...

郁也风
今天
3
0
shell基本案例

1、自定义rm linux系统的rm命令太危险,一不小心就会删除掉系统文件。 写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份,然后再删除。下面分两种情况,做...

寰宇01
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部