Java开发中常用的设计模式

原创
2016/10/09 12:52
阅读数 385

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 经典范例

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

    

    

 

 

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部