理解:門面模式就是將一些複雜的業務封裝起來,對使用者之提供一個簡單調用方法,使用者不須要知道方法裏面業務細節。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(); } }