跳到主要內容

發表文章

目前顯示的是 1月, 2017的文章

設計模式-Composition(組合模式)

將物件當作一個元件,將很多元件組合成樹狀結構,有人也稱為部分整理模式(part-whole pattern)。 組合模式定義 單個物件與組合的物件都有一致性 組合模式使用情況 有物件需要表達複數的狀況 組合模式UML圖 組合模式範例 我們建立員工資料,利用組合模式建立多筆的員工資料 /** * name: Employee.java * description : 員工個人資料 * Created by bryant on 2017/1/25. */ public class Employee { public Employee(String name, String dept, BigDecimal salary){ this.name = name ; this.dept = dept ; this.salary = salary; } private String no; //員工姓名 private String name ; //薪水 private BigDecimal salary ; //部門 private String dept ; //取得員工姓名 public String getName() { return name; } //設定員工姓名 public void setName(String name) { this.name = name; } //取得員工薪水 public BigDecimal getSalary() { return salary; } //設定員工薪水 public void setSalary(B...

設計模式-Adapter(配接器模式)

在日常生活中出國常需要電壓轉接頭,接電壓轉換為另外一種該國家可用的電壓規格。今天要介紹的配置器就是有這樣的作用,可以將兩個不同的系統藉由配置器去符合其他系統的標準。 配接器模式定義 將兩個不同模組介面,利用配接器可以結合在一起。 配接器模式使用狀況 1.當兩個系統需要串接時,需要將資料轉換成另一個系統可以使用的規格 2. 配接器模式UML圖 Target: 目標介面,需要轉換資料的目標 Adapter : 配接器角色,負責轉換為目標介面 Adaptee: 需要轉換的角色 配接器模式種類 Class Adapter(類別配接器): 利用繼承adaptee來完成配接器 Obejct Adapter(物件配接器): 利用組合物件的方式完成配接器 配接器模式範例 我們建立Adaptee為120電壓,利用Adapter變壓器來轉換電壓。本範例類別與物件配接器都有實作。 GitHub: https://github.com/blackbryant/designpattern/tree/master/java/src/design/adapter /** * name: Volt.java * description: 電壓物件 * Created by bryant on 2017/1/124 */ public class Volt { private float volt ; public Volt(float volt){ this.volt = volt ; } //取得電壓 public float getV(){ return this.volt ; } } /** * name: IAdapter.java * description: 變壓器介面 * Created by bryant on 2017/1/24. */ publi...

設計模式-簡介

希望利用一些物件導向設計的方式來使設計化繁為簡,讓系統達到低耦合、高內聚等好處。最讓人推崇為GoF四人幫所提出的23 種模式,本以JAVA為範例。這些模式希望以實務面來切入,讓大家更好理解與應用。 Gof 模式 創造型模式 1. Abstract Factory-抽象工廠模式 2. Factory Method-工廠模式 3. Builder-建立者模式 4. Prototype-原型模式 5. Singleton-獨體模式 結構模式 1. Adapter-配接器模式 2.Bridge-橋接模式 3. Composite-組合模式 4.Decorator-修飾器模式 5.Facade-外觀模式 6.Flyweight-輕量模式 7. Proxy-代理人模式 行為模式 1. Chain of Responsibility-責任鏈模式 2.Command-命令模式 3.Iterator-迭代模式 4. Strategy-策略模式 5. Template Method-樣本模式 6. Observer-觀察者模式 7.Mediator-協調者模式 8. State-狀態模式 9.Memento-備忘錄模式 10.Visitor-訪問模式 11.Interpreter-直譯模式 參考資料 良葛格-設計模式 搞笑談軟工 [設計模式:Android原始碼解析與應用] ( http://www.books.com.tw/products/0010709953 ) 深入淺出-設計模式

設計模式- Chain of Responsibility(責任鏈)

假設公司請假流程,需要三天需要經理簽核、五天需要副理,七天以上需要副總批准。我們需要使用責任鏈模式,物件會根據每個鏈結去執行,等待可以處理的鏈結才會停止。 責任鏈定義 對同一個事件作多個物件處理,這些物件會串成一個責任鏈,負責處理輸入的事件 責任鏈作用 當需要動態處理鏈結的處理需求 一連串流程處理 責任鏈範例 公司出差有規定當出差金額1千元以下經理簽核就可以,但是超過1萬元以上需要副總,超過1萬元為總經理和核准。 /** * name: IProcessHandler.java * Description : 管理者簽核處理-抽象 * Created by bryant on 2017/1/22. */ public abstract class IProcessHandler { protected IProcessHandler nextHandler; protected BigDecimal money ; public final void handler(BigDecimal money){ this.money = money; info(); if(money.compareTo(getLimit())==1){ this.nextHandler.handler(money); } } public abstract BigDecimal getLimit(); public abstract void info(); } /** * name: ManagerHandler.java * Description : 經理簽核 * Created by bryant on 2017/1/22. */ public class ManagerHandler extends IProcess...

設計模式-Proxy(代理模式)

代理模式也稱委託模式,日常事務很多代理模式,例如幫別人跑腿買東西,代理售票等等。在設計模式為其他物件服務某件功能。 代理模式定義 為物件提供代理服務 代理模式作用 想要託管物件行為 可以在該物件之前或之後,進行額外的動作 代理模式範例 本範例當我有一個網站服務WebService實作IService介面,網站服務利用WebProxy託管,當他託管時,可以在執行服務前後加上其他動作 /** * Name: IService.java * Description : 託管介面 * Created by bryant on 2017/1/20. */ public interface IService { //執行動作 public void doAction(); } /** * Name: WebService.java * Description : 網站託管 * Created by bryant on 2017/1/20. */ public class WebService implements IService { @Override public void doAction() { System.out.println("進行託管"); } } /** * Name: WebProxy.java * Description : 代理模式 * Created by bryant on 2017/1/20. */ public class WebProxy { private IService service ; public WebProxy(IService service){ this.service = service ; } public void acti...

設計模式-Template (樣本)

樣本方法就是將程式固定的步驟抽離出來,讓子類別根據不同狀況去實作適應之方法,例如很多部落格會提供樣板花邊,讓部落客使用不同的圖案。 github: https://github.com/blackbryant/designpattern/tree/master/java/src/design/template 樣本模式定義 將實務邏輯共同行為抽離出來,去定義基本步驟,讓子類別可以個別去實作它,讓模組可以內聚合。 樣本模式用法 1.讓子類別實作共有的方法 2.將核心程式抽離為樣本,周圍細節再由子類別實作 樣本模式範例 我們示範檔案收檔機制,會先定義好一個共用的樣板,再由其他子 類別依照不同情況去實作它。 我們大致可以知道收檔的流程: 下載方法、解析電文、處理和回饋這些步驟。 /** * Name: ContextTemplate.java * Description : 內文收檔樣本 * Created by bryant on 2017/1/14. */ public abstract class ContextTemplate { protected String filename ; //下載方法 protected boolean downloadDoc(String url, String to){ if(url.equals("")) return false ; else System.out.println("從"+url+"下載檔案到"+to) ; return true; } //解析文件 protected boolean parseDocc(String filename){ if(filename.equals("")) return fals...

設計模式-Observer (觀察者)

觀察者模式常常利用通知上面,當物件狀態改變需要通知其他全部的物件一起變更時,這種模式也被稱為 發佈-訂閱模式 觀察者定義 定義物件一對多關係,當一個物件改變狀態時,所有相依它的物件都會自動被改變。 主題(Subject) : 定義註冊、非註冊、通知改變和更新等動作 觀察者(observer): 設定主題和更新觀察者 案例: Java Message Service (JMS) 觀察者用法 跨系統訊息交換,如訊息序列、事件觸發等 關聯行為 GUI前後台的串接,當更新某個元件的狀態,也回影響 觀察者例子 我們利用主從式例子來說明觀察者的例子,當我主伺服器會下達˙訊息給三個從級伺服器,這三台會同步的更新訊息 /** * Name: Observer.java * Description : 觀察者 * Created by bryant on 2017/1/14. */ public interface IObserver { //更新觀察者、 public void update(); } /** * Name: ISubject.java * Description : 主題 * Created by bryant on 2017/1/14. */ public interface ISubject { //註冊 public void register(IObserver observer) ; //取消註冊 public void unregister(IObserver observer); //更新主題 public String update(); //通知觀察者 public void notifyObservers(); } /** *MasterSubject.java * Description : 主伺服器 ...

設計模式-Stragety (策略)

當你有很多計算方法,通常會將所以計算法則寫在同一個類別,但是當有新的演算法要加入時,你必須修改原來的程式,這種方式容易造成維護成本較高,如果把這些演算法抽離出來,提供統一個介面去實作,不僅擴充性高、可維護性也不錯。我們稱為 策略模式 。 github: https://github.com/blackbryant/designpattern/tree/master/java/src/design/stragety 策略模式定義 策略模式將多個演算法則定義一個介面,並把每個演算法封裝,方便擴展和使用 策略模式用法 多個處理方法或演算法(例如排序: 選擇排序、泡沫排序、插入排序) 2.業務邏輯中有類似行為但是使用的方法不同 策略模式例子 我們利用進銷存拋帳為例子,當銷售作業、入庫作業、退貨作業都需要拋帳時,我們可以做一個共同介面為TradeStragety讓各作業來實作拋帳規則。因為對各作業拋帳是共同一個行為,但是實作方法不同。 首先定義一個拋帳介面,當入庫、銷售和退貨當完成程序時,會將做最後帳務拋轉。 /** * Name: TradeStragety.java * Description : 拋帳策略模式-介面 * Created by bryant on 2017/1/14. */ public interface TradeStragety { //拋帳 public boolean doTrade(); } 銷售拋障實作TradeStragety介面來完成拋帳 /** * Name: SaleTradeStragety.java * Description : 銷售拋帳 * Created by bryant on 2017/1/14. */ public class SaleTradeStragety implements TradeStragety{ @Override public boolean doTrade() { System.out.p...

設計模式-State (狀態)

狀態模式跟策略模式結構一樣,最大的不同狀態模式會根據狀態的不同,切換不同的動作,所以我們會將狀態物件抽離出來 狀態模式定義 物件行為的改變會根據它內部物件的狀態 狀態模式用法 物件操作跟他的狀態有相依關係,我們就可以它抽離出來,並在物件運行時,會根據系統狀態還變化它的操作 如果程式碼有很多if-else跟物件狀態有關,可以利用狀態模式來簡化程式設計 狀態模式例子 下面我們以生產機器為例子,機器的狀態有開始、停止、暫停與工作中四種狀態,會根據工人日常作業,1.上班時,會開啟機器為開機;2.中午休息會將機器切換暫停;3.當下班時,會將基季 /** * name: State * description:: 定義系統的狀態為開始]、停止、暫停與工作中 * Created by bryant on 2017/1/12 */ public class State { public enum SystemState {STOP, SUSPEND, WORKING, START } public SystemState systemState =SystemState.STOP ; public void setState(SystemState systemState){ this.systemState = systemState; } } /** * name: StartState * description: 打開機器狀態 * Created by bryant on 2017/1/12 */ public class StartState implements Machine { @Override public void operate(State state) { System.out.println("機器開始運行") ; state.setState(S...

設計模式-AbstractFactory (抽象工廠模式)

之前介紹工廠模式對一個相同屬性的物件做處理,但是當我有很多物件需要組合?這時候可以使用抽象工廠模式 抽象工廠模式定義 為一組相互關係的物件提供一個介面,來組裝起來 抽象工廠模式用法 以 Abstract Factory 設計模式的 UML 結構圖來看,根據《 物件導向設計模式 》(Design Patterns) 書中所述,其中定義了參與抽象工廠模式的幾個角色: 抽象工廠角色(AbstractFactory) : 介面宣告出可生成各抽象成品物件的操作 具體工廠角色(ConcreteFactory) : 具體實作出可建構具象成品物件的操作 抽象產品角色(AbstractProduct) : 宣告某成品物件類型之介面 具體產品角色(ConcreteProduct):是 ConcreteFactory 所建構的成品物件 用戶端: 使會使用到AbstractFactory和AbstractProduct 抽象工廠模式實例 /** * name: IProductFactory * role : AbstractFactory * description: 產品抽象類別 * Created by bryant on 2017/1/11. */ public abstract class IProductFactory { //產生播放器 public abstract IPlayer createPlayer(); //產生耳機 public abstract IEarphone createEarphone(); } /** * name: IPlayer * role : AbstractProduct * description: 播放器抽象類別 * Created by bryant on 2017/1/11. */ abstract class IPlayer { //播放抽象 abstract public void play() ; } ...

設計模式-Factory (工廠模式)

工廠模式是設計模式最為常用的模式之一,此模式可以想像你有一家工廠需要生產那些產品(既物件), 工廠模式定義 利用介面或是抽象物件來定義產品的明細或操作,再利用工廠對產品產生實例 工廠模式用法 當有很多產品是有共同的特性可以利用介面抽離出來,在使用工廠的new實例 工廠模式案例 我們定義IProduct為車的抽象類別,再利用CarFactory來指定需要產生哪種車款 /** * Name: IProduct.java * Description : 產品抽象物件 * Created by blackbryant on 2017/1/9. */ public abstract class IProduct { protected abstract String getName() ; protected abstract List getColor() ; protected abstract List getOperate(); } /** * Name: MPV.java * Description : SUV * Created by bryant on 2017/1/9. */ public class MPV extends IProduct { @Override protected String getName() { return "MPV"; } @Override protected List getColor() { List colors = new ArrayList(); colors.add("紅"); colors.add("藍"); colors.add("鐵灰"); return co...

設計模式-Prototype (原型)

Prototype定義 利用雛型模式可以拷貝這些物件並建立新物件,主要可以分為淺拷貝與深拷貝 1. 淺拷貝: 有稱影子拷貝,拷貝原物件並將原有的物件所以欄位重新建立一次,只針對需要的欄位完整複製,其他部分則是參照的方式完成。 Prototype使用情況 當有需要複製原物件,還當作副本提供其他系統修改,來保護原物件 當產生new 物件需要浪費很多時間或是很多資訊時,可以考慮用原型模式完成 3. Prototype案例 -淺拷貝 我們利用員工薪水的例子來說明原型,在一家公司假設工程師基本薪水有30K,假設每天都需要加班一小時,一個月上班22天要如何算出月薪。不同語言支援的複製功能有不同的規範,使用java需要讓員工物件有複製的功能需要實作 java.lang.Cloneable 這個介面。 IEmploy.java : 為抽象員工物件、EngineerShallow.java實作員工物件、Profile.java:為員工基本資料,我們為了可以快速算出員工薪水利用淺拷貝來快速建立其他員工資料。但是淺拷貝有一個缺點就是當執行baseProfile.setName("Mary")時,emp1也會跟著改變,因為淺拷貝當拷貝物件時,有參照外部的物件,也跟著參照並不會完整複製。 package design.Prototype; /** * name: IEmploy.java * descirpt: 員工薪水抽象物件,主要用來建立基本資料、薪水、加班費等等 * Created by bryant on 2017/1/8. */ abstract class IEmploy { //基本薪水 abstract protected void setBaseSalary(BigDecimal baseSalary); //津貼 abstract protected void setBonus(BigDecimal bouns); //加班費 abstract protected void setOvertimeS...

設計模式-Builder(建立者)

Builder 定義 使用物件有多參數輸入時,可以簡化多參數建立並初始化實例功能 強調物件屬性與物件建構可以分離,不同建構可以表示不同物件 Builder 使用情況 初始化參數因參數多,簡化參數建立過程 2. Builder 案例 這是利用Buildr模式來簡化日期計算可以看到DateBuilder建立只有基本參數宣告,實際計算方法是建立在Builder物件中,最後載執行由Calendar做日期加減的計算。建立者分離的物件參數與計算方法,但是帶來良好封裝性 /** * Name: builder * Description : 日期建立可以自由輸入年 月 日後,建立日期 * Created by blackbryant on 2017/1/7. */ public class DateBuilder { private Locale locale ; private String format ; private int day ; private int month ; private int year ; private int hour ; private int minute ; private int second ; private String date ; //需要宣告為靜態類別 public static class Builder{ private Locale locale ; private String format ; private int day ; private int month ; private int year ; private int hour ; private int minute ; ...

設計模式-Singleton(獨體模式)

Singleton 定義 確保每次呼叫都只會有固定自行產生一個實例並提供給整個系統使用 Singleton 使用 單例模式可以避免產生多個物件消耗多個資源,如資料庫、IO存取 系統參數設定只需要共同一個設定,例如: andorid 中 Context系統內文 Singleton 單例案例 java範例 /** * Name: singleton * Description : To generate onaly one database configuration instane when it is called * Created by blackbryant on 2017/1/7. */ public class DBConfigSinglton { public static final DBConfigSinglton singlton = new DBConfigSinglton("com.mysql.jdbc.Driver","jdbc:mysql://localhost/EMP","jack","123456"); private String className ; private String db_url ; private String user; private String password; private DBConfigSinglton(String className, String db_url, String user, String password){ this.className = className ; this.db_url= db_url ; this.user = user ; this.password = password ; } publ...