設計模式學習一

門面模式

理解:門面模式就是將一些複雜的業務封裝起來,對使用者之提供一個簡單調用方法,使用者不須要知道方法裏面業務細節。java

主要包含業務接口、業務實現類、門面類、使用者ide

業務接口ui

package com.sean.design.facade;

/**
 * 完成寫信過程的類
 * @author Administrator
 *
 */
public interface LetterProcess {

	/**
	 * 寫信的內容
	 * @param context
	 */
	public void writeContext(String context);
	
	/**
	 * 寫信封
	 * @param address
	 */
	public void fillEnvelope(String address);
	
	/**
	 * 信放到信封裏面
	 */
	public void letterIntoEnvelope();
	
	/**
	 * 郵寄
	 */
	public void sendLetter();
}

業務實現類spa

package com.sean.design.facade;

public class LetterProcessImpl implements LetterProcess {

	@Override
	public void writeContext(String context) {
		System.out.println("寫信的內容:"+context);
	}

	@Override
	public void fillEnvelope(String address) {
		System.out.println("寫信封:"+address);
	}

	@Override
	public void letterIntoEnvelope() {
		System.out.println("將信裝入到信封裏面!");
	}

	@Override
	public void sendLetter() {
		System.out.println("將信郵寄出去!");
	}

}

門面類code

package com.sean.design.facade;

public class ModenPostOffice {

	
	private LetterProcess letterProcess = new LetterProcessImpl();
	
	/**
	 * 將寫信並郵寄整個過程封裝到該方法中
	 * @param context
	 * @param address
	 */
	public void sendLetter(String context,String address){
		//寫信的內容
		letterProcess.writeContext(context);
		//寫信封
		letterProcess.fillEnvelope(address);
		//將信內容放入到信封中
		letterProcess.letterIntoEnvelope();
		//郵寄
		letterProcess.sendLetter();
	}
}

使用者對象

package com.sean.design.facade;

public class Client {

	public static void main(String[] args) {
		
		//寫信並郵寄
		ModenPostOffice modenPostOffice = new ModenPostOffice();
		
		modenPostOffice.sendLetter("你好這是一封信件!", "郵寄地址");
	}
}

適配器模式

理解:通常理解爲有兩個類A、B要處理,目前使用者只能夠處理A類,若要兼顧處理B類時,就須要增長一個適配器,將B類適配爲A類的子類。適配器同時繼承A和B類。在適配器內部將B類的處理轉化爲A類的方法。繼承

主要包含現有能夠被處理的類、被適配類、適配器、使用者接口

現有能夠被處理類get

package com.sean.design.adapter;

public interface InUser {

	public String getUserName();
}

被適配類接口產品

package com.sean.design.adapter;

public interface OutUser {

	public String getName();
}

被適配實現類

package com.sean.design.adapter;

public class OutUserImpl implements OutUser {

	@Override
	public String getName() {
		return "out-name";
	}

}

適配器:同時繼承現有能夠被處理類和被適配的類接口

package com.sean.design.adapter;

public class OutUserAdapter extends OutUserImpl implements InUser {

	@Override
	public String getUserName() {
		return super.getName();
	}

}

使用者:OutUser被適配以後能夠直接當作InUser使用

package com.sean.design.adapter;

public class Client {

	public static void main(String[] args) {
		InUser myUser = new OutUserAdapter();
		String userName = myUser.getUserName();
		System.out.println(userName);
	}

}

模板方法模式

理解:在抽象類中定義了執行某個業務調用其餘方法的順序或邏輯。在子類中實現其餘具體方法。

包含:抽象類中的模板方法、抽象類中未實現的基本方法、子類中實現的具體方法、鉤子方法。

抽象類:包含模板方法,定義基本方法調用邏輯和順序

package com.sean.design.template;

public abstract class HmModel {

	/**
	 * 基本方法
	 */
	protected abstract void start();

	/**
	 * 基本方法
	 */
	protected abstract void alarm();

	/**
	 * 鉤子方法
	 * 
	 * @return
	 */
	protected abstract boolean isAlarm();

	/**
	 * 末班方法,在抽象類中實現
	 */
	public void run() {
		start();
		if (isAlarm()) {
			alarm();
		}

	}
}

子類1:具體方法實現

package com.sean.design.template;

public class Hm1Model extends HmModel {

	@Override
	protected void start() {
		System.out.println("這是模板1:start");
	}

	@Override
	protected void alarm() {
		System.out.println("這是模板1:alarm");
	}

	@Override
	protected boolean isAlarm() {
		return false;
	}

}

子類2:具體方法實現

package com.sean.design.template;

public class Hm2Model extends HmModel {

	@Override
	protected void start() {
		System.out.println("這是模板2:start");
	}

	@Override
	protected void alarm() {
		System.out.println("這是模板2:alarm");
	}

	@Override
	protected boolean isAlarm() {
		return true;
	}

}

調用模板方法

package com.sean.design.template;

public class Client {

	public static void main(String[] args) {
		HmModel hm1 = new Hm1Model();
		hm1.run();
		
		HmModel hm2 = new Hm2Model();
		hm2.run();
	}
}

建造者模式

理解:相似於工廠模式,有專門的建造者類負責產生product對象,建造者模式中產生product對象時能夠設置一些邏輯。工廠模式產生的對象能夠使不一樣類型,而一個建造者產生的對象都是相同類型。

包含產品抽象類、產品子類、建造者接口,建造者類、使用者

產品抽象類

package com.sean.design.builder;

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

public abstract class Product {
	
	public List<String> seq = new ArrayList<>();
	
	public abstract void business1();
	
	public abstract void business2();
	
	
	public void run(){
		for (String str : seq) {
			if("business1".equals(str)){
				business1();
			}
			if("business2".equals(str)){
				business2();
			}
		}
	}
	

}

產品子類

package com.sean.design.builder;

public class ProductImpl extends Product {

	@Override
	public void business1() {
		System.out.println("產品1方法:business1");
	}

	@Override
	public void business2() {
		System.out.println("產品1方法:business2");
	}

}

建造者接口

package com.sean.design.builder;

import java.util.List;

public interface ProductBuilder {

	/**
	 * 設置參數
	 * @param seq
	 */
	public void setSeq(List<String> seq);
	
	/**
	 * 建造產品
	 * @return
	 */
	public Product createProduct();
}

建造者實現類

package com.sean.design.builder;

import java.util.List;

public class ProductBuilderImpl implements ProductBuilder {

	Product p = new ProductImpl();
	
	@Override
	public void setSeq(List<String> seq) {
		p.seq = seq;
	}

	@Override
	public Product createProduct() {
		return p;
	}

}

使用者

package com.sean.design.builder;

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

public class Client {

	public static void main(String[] args) {
		//建造者
		ProductBuilder pBuilder = new ProductBuilderImpl();
		List<String> seq = new ArrayList<>();
		seq.add("business2");
		seq.add("business1");
		pBuilder.setSeq(seq);
		
		//經過建造者建立對象
		Product product = pBuilder.createProduct();
		
		product.run();
	}
}
相關文章
相關標籤/搜索