现在的位置: 首页 > 综合 > 正文

Java Design Model

2018年04月27日 ⁄ 综合 ⁄ 共 6922字 ⁄ 字号 评论关闭

设计模式的分类:分类标准是根据目的准则

1 创建型:与对象的创建有关

2 结构型:处理类与对象之间的组合

3 行为型:描述类与对象如何交互及如何分配职责

一共有23中设计模式

创建型:

1.抽象工厂模式AbstractFactory

2.建造者模式Builder

3.工厂方法模式FactoryMethod

4.原型模式Prototype

5.单例模式Singleton

结构型:

1.适配器模式Adapter

2.桥接模式Bridge

3.组合模式Composite
4.
装饰模式Decorator

5.外观模式Facade

6.享元模式Flyweight
7.
代理模式Proxy

行为型:

1.职责链模式Chainof
Responsibility

2.命令模式Command
3.
解释器模式Interpreter

4.迭代器模式Iterator

5.中介者模式Mediator
6.
备忘录模式Memento

7.观察者模式Observer

8.状态模式State
9.
策略模式Strategy

10.模板方法模式TemplateMethod

11.访问者模式Visitor

重点学习以下四种模式:工厂模式、单例模式、观察者模式、代理模式

工厂模式

    特点:

    1.1 简单工厂模式

    1.2 工厂方法模式

    1.3 抽象工厂模式


开闭原则:对程序扩展开放,对程序修改关闭

使用各种程序设计模式的最主要目的:提高程序的扩展性、可维护性

使用工厂模式的两种情况:

1. 不能预见将要创建的那种类的实例

2. 系统不关心对象被创建的具体细节

代码示例:

<<简单工厂>>

/**
 * 简单工厂
 * 1 工厂类角色
 * 2 抽象产品类角色
 * 3 具体产品类角色
 * */

// 抽象产品类角色
interface Car{
	public void drive();
}

//具体产品类角色
class RedCar implements Car{
	public void drive(){
		System.out.println("I'm driving a red Car.");
	}
}

//具体产品类角色
class BlackCar implements Car{
	public void drive(){
		System.out.println("I'm driving a Black Car.");
	}
}

//这里可以扩展其他的颜色的产品...

//工厂类角色
class SimpleFactory{
	Car car;
	String color;
	public SimpleFactory(String color){
		this.color=color;
	}
	public Car getObject(){
		if(color.equals("red")){
		car=new RedCar();
		return car;
		}else if(color.equals("black")){
		car=new BlackCar();
		return car;
		}
		else{
		System.out.println("no related Chioce!");	
		return null;
		}
	}	
}
public class FactoryDemo {
    public static void main(String agrs[]){
    	SimpleFactory f1=new SimpleFactory("red");
    	SimpleFactory f2=new SimpleFactory("black");
      RedCar redCar=(RedCar)f1.getObject();
      redCar.drive();
    	f1.getObject().drive();
      f2.getObject().drive();  
    }
}

   <<抽象工厂>>

/**
 * 工厂方法模式
 *  1  抽象工厂角色
 *  2  具体工厂角色
 *  3  抽象产品角色
 *  4  具体产品角色
 * 
 * 说明:由于业务的复杂,利用简单工厂模型不再适用,因为当增加产品时,对于产品符合开闭原则,
 *     但是对于工厂角色则明显不符合开闭原则,所有现在需要将工厂角色也抽象出来,可以是抽象
 *     类或者借口实现
 * */

//抽象工厂角色
interface AbstractFactory{
	public Car getObject(String color);
}

//具体工厂角色
class Factory1 implements AbstractFactory{
	Car car;
	public Car getObject(String color){
		if(color.equals("red")){
			car=new RedCar();
			return car;
		}
		else if(color.equals("black")){
			car=new BlackCar();
			return car;
		}
		else {
		    System.out.println("there is no related Option!");
		    return  null;
		}		
	}
}

//具体工厂角色
class Factory2 implements AbstractFactory{
	Car car;
	public Car getObject(String color){
		if(color.equals("yellow")){
			car=new YellowCar();
			return car;
		}
		else if(color.equals("blue")){
			car=new BlueCar();
			return car;
		}
		else {
		    System.out.println("there is no related Option!");
		    return  null;
		}		
	}
}

//这里可以添加很多具体工厂。。。

// 抽象产品角色同上
// 具体产品角色可以在扩展,比如说下面再扩展两个具体的产品角色YellowCar,BlueCar

// 抽象产品类角色
interface Car{
	public void drive();
}

//具体产品类角色
class RedCar implements Car{
	public void drive(){
		System.out.println("I'm driving a red Car.");
	}
}

//具体产品类角色
class BlackCar implements Car{
	public void drive(){
		System.out.println("I'm driving a Black Car.");
	}
}
//具体产品角色
class YellowCar implements Car{
	public void drive(){
		System.out.println("I'm driving a yellow Car.");
	}
}

//具体产品角色
class BlueCar implements Car{
	public void drive(){
		System.out.println("I'm driving a blue Car.");
	}
}

public class FactoryDemo {
    public static void main(String agrs[]){
        Factory1 ff1=new Factory1();
        ff1.getObject("red").drive();
        ff1.getObject("black").drive();
        
        Factory2 ff2=new Factory2();
        ff2.getObject("yellow").drive();
        ff2.getObject("blue").drive();
        
        
    }
}

2  单例模式

  特点:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供该实例

  
代码示例:

//懒汉式
 class Singleton2{
	 private Singleton2(){} // 避免类被外部实例化
	 private static Singleton2 singleton;
	 public static Singleton2 getInstance(){
	    	if(singleton==null)
	    		singleton=new Singleton2();
	        return singleton;  	
	    }	
	
}
 // 饿汉式
 class Singleton1{
	 private Singleton1(){}
	 private static Singleton1 singleton1=new Singleton1();
	 static Singleton1 getInstance(){
		 return singleton1;
	 }
	 
 }

3 观察者模式

特点:简单地说就是有一个或多个观察者对一个被观察者进行监视,当被观察者发生变化时则通知所有的观察者更新,达到这样一个效果。

(更详细的参考:点击打开链接)

代码示例

package org.wb.pattern;

import java.util.Vector;

/**
 * 1 观察者
 *   1.1 抽象观察者:可以由抽象类或接口实现,实现一个update()方法,更新操作       
 *   1.2 具体观察者:继承或实现抽象观察者
 * 
 * 2 被观察者
 *   2.1 抽象被观察者:可以由抽象类或接口实现,包括观察者列表、添加、删除观察者、通知观察者更新
 *   2.2 具体被观察者:继承或实现抽象被观察者
 * */

public class ObserverDemo {
    public static void main(String agrs[]){
    	Observer1 observer1=new Observer1();
    	Observer2 observer2=new Observer2();
    	Observered observered=new Observered();
    	observered.addObserver(observer1);
    	observered.addObserver(observer2);
    	observered.notifyObserver();
    }
}
//抽象观察者
interface AbstractObserver{
	public void update();
}

//具体观察者
class Observer1 implements AbstractObserver{
	public void update(){
		System.out.println("Observer1 get it!!");
	}
}

//具体观察者
class Observer2 implements AbstractObserver{
	public void update(){
		System.out.println("Observer2 get it!!");
	}
}

//抽象被观察者
interface AbstractObservered{
	//在具体实现中需要加上观察者列表
	public void addObserver(AbstractObserver observer);
	public void deleteObserver(AbstractObserver observer);
	public void notifyObserver();
}

//具体被观察者
class Observered implements AbstractObservered{
	Vector <AbstractObserver> vactorList=new Vector<AbstractObserver>();
	
	public void addObserver(AbstractObserver observer){
		if(!vactorList.contains(observer)){
			vactorList.add(observer);
		}
	}
	
	public void deleteObserver(AbstractObserver observer){
		if(vactorList.contains(observer)){
			vactorList.remove(observer);
		}
	}
	//通知观察者列表中所有的观察者更新
	public void notifyObserver(){
		if(vactorList.size()!=0){
			for(AbstractObserver observer:vactorList){
				 observer.update();
			}
		}
	}
	
}

4 代理模式

特点:在有些情况下,一些客户对象不能直接或者不需要直接访问另一个对象,而是用代理对象来完成对真实对象的访问的情况

代码示例

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 1 抽象类角色:真实类或代理类需要继承或实现的角色
 * 2 真实类角色:最终要被引用的对象,代理类角色所代表的对象
 * 3 代理类角色:代理类对象中包含有对真实类对象的引用,对真实类进行操作,同时也可以添加一些额外的操作
 *              简单的说就是对真实类进行封装
 * 4 客户端角色:客户端对象通过对代理类的访问来达到操作真实类的母的,比如说有些情况我们不能直接访问到
 *              真实类,那么我们只能利用代理的方式
 *              
 * 5 动态代理:简单地说就是在程序运行时才产生代理类对象
 * 
 * 6 下面将实现一般代理和动态代理
 * 
 * */


public class ProxyDemo {
//     public static void main(String agrs[]){
//    	 RealSubject rs=new RealSubject();
//    	 ProxySubject ps=new ProxySubject(rs);
//    	 ps.option();
//     }
	
	public static void main(String args[]){
       RealSubject rs=new RealSubject();
       DynamicProxy dp=new DynamicProxy(rs);
       Class<? extends RealSubject> cls=rs.getClass();
       AbstractSubject abstractSubject=(AbstractSubject)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),dp);
	   abstractSubject.option();		
	}
}

//抽象类角色
interface AbstractSubject{
	public void option();
}
//真实类角色
class RealSubject implements AbstractSubject{
	public void option(){
		System.out.println("来自真实类角色对象的操作!");
	}
}
//代理类角色
class ProxySubject implements AbstractSubject{
	RealSubject realSubject;//在代理类中必须要包含被真实代理的对象
	public ProxySubject(RealSubject realSubject){
		this.realSubject=realSubject;
	}
	
	public void option(){
		before();
		if(realSubject!=null){
			realSubject.option();
		}		
		after();
	}
	public void before(){
		System.out.println("在代理操作前的准备!");
	}
	public void after(){
		System.out.println("在代理操作后的处理!");
	}	
}


/**
 * 动态代理示例:动态代理和一般代理的区别是,动态代理可以在程序运行时生成代理类实例对象
 * 
 * */

//代理类角色
class DynamicProxy implements InvocationHandler{
	RealSubject realSubject;
	public DynamicProxy(RealSubject realSubject){
		this.realSubject=realSubject;
	}
	public Object invoke(Object obj,Method method,Object[] args){
		before();
		try {
			method.invoke(realSubject, args);
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		after();
		return null;
	}
	public void before(){
		System.out.println("在代理操作前的准备!");
	}
	public void after(){
		System.out.println("在代理操作后的处理!");
	}
}

        总结:对于设计模式在平时写代码的过程中没有怎么用,这次特意整理一下,方便以后再学习或者遇到的时候能有点印象

【上篇】
【下篇】

抱歉!评论已关闭.