設計模式

一、設計模式六大原則

        單一職責原則: adapter做適配的事 Bean做Bean的處理 

       開放封閉原則:像調用jar裏面的函數 模塊 只能用 不能改

       里氏替換原則:像多態  子類可以複製給父類的引用 反過來 不行

       依賴倒置原則:說了等於沒說

       迪米特原則:  說了等於沒說

    

       設計模式分爲三類:

       創建類型模式:單例、工廠、建造者...

       結構型設計模式:適配器、代理、橋接...

       行爲型設計模式:策略、觀察者、迭代器...


   1.單例模式

      保證一個類只有一個實例,並提供一個全局訪問點   使用場景:項目中共享的數據 消耗資源多的對象 工具類對象

public class Singleton {
	
     private Singleton(){
		
	}
	/*
	 * 餓漢模式 類加載時就完成初始化  獲取對象塊 沒有同步問題
	 */
	private static Singleton instance=new Singleton();
	
	public static Singleton getInstance(){
		return instance;
	}
	
	/*
	 * 懶漢模式 
	 */
     private static Singleton instance2;
     
     public static synchronized Singleton getInstance2(){
    	if(instance2==null)
    		instance2=new Singleton();
    	
    	return instance2;
    }
     
     /*
      * 雙重檢查模式 DCL
      */
     private volatile static Singleton singleton3;
     public static Singleton getInstance3(){
    	 if(singleton3==null){
    		 synchronized(Singleton.class){
    			 singleton3=new Singleton();
    		 }
    	 }
    	 return singleton3;
     }
     
     /*
      * 靜態內部類
      */
     public static Singleton getInstance4(){
    	 return SingHolder.sholder;
     }
     private static class SingHolder{
    	 private static final Singleton sholder=new Singleton();
    	 
     }
}


2.簡單工廠模式

 又名靜態工廠方法模式 這是由一個工廠對象決定創建出哪一種產品類的實例

(1) 抽象產品類

package factory;

public abstract class Computer {
/*
 * 產品的抽象方法 由具體的產品類實現
 */
	
	public abstract void start();
	
}

(2)具體產品類

package factory;

public class LenovoCom extends Computer{

	@Override
	public void start() {
		// TODO Auto-generated method stub
		System.out.println("我是聯想計算機");
	}

}


(3)工廠類

package factory;

public class ComFactory {
	
	public static Computer createComputer(String type){
		Computer mcomp=null;
		if(type.equals("lenovo"))
			mcomp=new LenovoCom();
		else if(type.equals("huawei"))
			mcomp=new Huawei();
		return mcomp;
		
	}

}

(2)客戶端調用工廠類

package factory;

public class MyComputer {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
ComFactory.createComputer("lenovo").start();;

	}

}

3.觀察者模式

 即發佈-訂閱模式 在項目中經常使用的模式 

 (1)抽象觀察者

package observer;

public interface Observer {
	//定義一個更新消息的方法
public void update(String message);

}
(2)具體觀察者
package observer;

public class UserWeixin implements Observer{
	//微信用戶
	private String name;
  public UserWeixin(String name){
	  this.name=name;
  }
	@Override
	public void update(String message) {
		// TODO Auto-generated method stub
		System.out.println(name+" - "+message);
	}

}
(3)抽象被觀察者

package observer;

public interface Subject {
	/*
	 *  新增訂閱者
	 */
	public void attach(Observer observer);
	/*
	 *  刪除訂閱者
	 */
	public void detach(Observer observer);
	/*
	 *  通知訂閱者更新消息
	 */
	public void notify(String message);
	
}

(4)具體被觀察者模式


package observer;

import java.util.ArrayList;
import java.util.List;

public class SubscriptionSubject implements Subject {
	//存儲訂閱公衆號的用戶
	private List<Observer> userList=new ArrayList<Observer>();

	@Override
	public void attach(Observer observer) {
		// TODO Auto-generated method stub
		userList.add(observer);
	}

	@Override
	public void detach(Observer observer) {
		// TODO Auto-generated method stub
		userList.remove(observer);
	}

	@Override
	public void notify(String message) {
		// TODO Auto-generated method stub
		for(Observer observer:userList){
			observer.update(message);
		}
	}

}

  (5)客戶端調用

package observer;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		SubscriptionSubject mssubject=new SubscriptionSubject();
		
		//用戶
        UserWeixin user1=new UserWeixin("鍾惠華");
        UserWeixin user2=new UserWeixin("薛翠英");
        UserWeixin user3=new UserWeixin("王大嬸");
        //訂閱公衆號
        mssubject.attach(user1);
        mssubject.attach(user2);
        mssubject.attach(user3);
        
        //公衆號更新發消息給訂閱了的用戶
        mssubject.notify("週末去小梅沙一浪  message");
        
        //user1 走了 退訂了
        mssubject.detach(user1);
       //公衆號更新發消息給訂閱了的用戶
        mssubject.notify("週末去浪啊  message");
       
	}

}







    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章