├── .classpath ├── .gitignore ├── .project ├── .settings └── org.eclipse.jdt.core.prefs ├── README.md ├── client ├── c01 │ └── simpleFactory │ │ ├── CalculatorClient.java │ │ └── CashFactoryClient.java ├── c02 │ └── strategy │ │ └── CashClient.java ├── c06 │ └── decorator │ │ └── DecoratorClient.java ├── c07 │ └── proxy │ │ └── ProxyClient.java ├── c08 │ └── factory │ │ └── NightingaleClient.java ├── c09 │ └── prototype │ │ └── ResumeClient.java ├── c10 │ └── template │ │ └── TestPaperClient.java ├── c12 │ └── facade │ │ └── FundClient.java ├── c13 │ └── builder │ │ └── PersonBuilderClient.java ├── c14 │ └── observer │ │ └── BossNotifyClient.java ├── c15 │ └── abstractFactory │ │ └── DaoClient.java ├── c16 │ └── state │ │ └── StateClient.java ├── c17 │ └── adapter │ │ └── TranslatorClient.java ├── c18 │ └── memento │ │ └── GameRoleClient.java ├── c19 │ └── composite │ │ └── CompanyClient.java ├── c20 │ └── iterator │ │ └── IteratorClient.java ├── c21 │ └── singleton │ │ └── SingletonClient.java ├── c22 │ └── bridge │ │ └── HandsetClient.java ├── c23 │ └── command │ │ └── BarbecueClient.java ├── c24 │ └── ChainOfResponsibility │ │ └── ManagerClient.java ├── c25 │ └── mediator │ │ └── UniteNationsClient.java ├── c26 │ └── flyweight │ │ └── WebsiteClient.java ├── c27 │ └── interpreter │ │ └── ContextPlayClient.java └── c28 │ └── visitor │ └── PersonActionClient.java ├── src ├── c01 │ └── simpleFactory │ │ ├── Calculator.java │ │ ├── CalculatorA.java │ │ ├── CalculatorFactory.java │ │ ├── CalulatorAdd.java │ │ ├── CalulatorDiv.java │ │ ├── CalulatorMul.java │ │ └── CalulatorSub.java ├── c02 │ └── strategy │ │ ├── CashContext.java │ │ ├── CashContextPro.java │ │ └── simpleFactory │ │ ├── CashDiscount.java │ │ ├── CashFactory.java │ │ ├── CashNomal.java │ │ ├── CashReturn.java │ │ └── CashSuper.java ├── c06 │ └── decorator │ │ ├── Finery.java │ │ ├── Person.java │ │ ├── Sneakers.java │ │ ├── TShirts.java │ │ └── Trouser.java ├── c07 │ └── proxy │ │ ├── IGiveGift.java │ │ ├── Proxy.java │ │ ├── Pursuit.java │ │ └── SchoolGirl.java ├── c08 │ └── factory │ │ ├── IFactory.java │ │ ├── Nightingale.java │ │ ├── SimpleFactory.java │ │ ├── Undergraduate.java │ │ ├── UndergraduateFactory.java │ │ ├── Volunteer.java │ │ └── VolunteerFactory.java ├── c09 │ └── prototype │ │ └── Resume.java ├── c10 │ └── template │ │ ├── TestPaper.java │ │ ├── TestPaperA.java │ │ └── TestPaperB.java ├── c12 │ └── facade │ │ └── Fund.java ├── c13 │ └── builder │ │ ├── GundamBuilder.java │ │ ├── LinePersonBuilder.java │ │ ├── PersonBuilder.java │ │ └── PersonDirector.java ├── c14 │ └── observer │ │ ├── Boss.java │ │ ├── NBAObserver.java │ │ ├── Observer.java │ │ ├── Secretary.java │ │ ├── StockObserver.java │ │ └── Subject.java ├── c15 │ └── abstractFactory │ │ ├── Department.java │ │ ├── IDeptDao.java │ │ ├── IFactory.java │ │ ├── IUserDao.java │ │ ├── OracleDaoFactory.java │ │ ├── OracleDeptDao.java │ │ ├── OracleUserDao.java │ │ ├── SqlServerDaoFactory.java │ │ ├── SqlServerDeptDao.java │ │ ├── SqlServerUserDao.java │ │ └── User.java ├── c16 │ └── state │ │ ├── AfternoonState.java │ │ ├── EveningState.java │ │ ├── ForenoonState.java │ │ ├── NoonState.java │ │ ├── RestState.java │ │ ├── State.java │ │ └── Work.java ├── c17 │ └── adapter │ │ ├── CenterPlayer.java │ │ ├── ForeignCenterPlayer.java │ │ ├── Player.java │ │ └── Translator.java ├── c18 │ └── memento │ │ ├── GameRole.java │ │ ├── RoleStateCareTaker.java │ │ └── RoleStateMemo.java ├── c19 │ └── composite │ │ ├── Company.java │ │ ├── ConcreteCompany.java │ │ ├── FinaneDept.java │ │ └── HRDept.java ├── c20 │ └── iterator │ │ ├── Aggregate.java │ │ ├── ConcreteAggregate.java │ │ ├── ConcreteIterator.java │ │ └── Iterator.java ├── c21 │ └── singleton │ │ └── Singleton.java ├── c22 │ └── bridge │ │ ├── HandsetBrand.java │ │ ├── HandsetBrandM.java │ │ ├── HandsetBrandN.java │ │ ├── HandsetContactList.java │ │ ├── HandsetGame.java │ │ └── HandsetSoft.java ├── c23 │ └── command │ │ ├── BakeChickenWingCommand.java │ │ ├── BakeMutonCommand.java │ │ ├── Barbecuer.java │ │ ├── Command.java │ │ └── Waiter.java ├── c24 │ └── ChainOfResponsibility │ │ ├── ApplyRequest.java │ │ ├── CommonManager.java │ │ ├── GeneralManager.java │ │ ├── Majordomo.java │ │ └── Manager.java ├── c25 │ └── mediator │ │ ├── Country.java │ │ ├── Iraq.java │ │ ├── UNSC.java │ │ ├── USA.java │ │ └── UniteNations.java ├── c26 │ └── flywight │ │ ├── ConcreteWebsite.java │ │ ├── User.java │ │ ├── WebSiteFactory.java │ │ └── Website.java ├── c27 │ └── interpreter │ │ ├── Expression.java │ │ ├── Note.java │ │ ├── PlayContext.java │ │ └── Scale.java └── c28 │ └── visitor │ ├── Action.java │ ├── Failing.java │ ├── Man.java │ ├── ObjectStructure.java │ ├── Person.java │ ├── Success.java │ └── Woman.java └── uml ├── AbstractFactory.ucls ├── Adapter.ucls ├── Bridge.ucls ├── Builder.ucls ├── ChainOfResponsibility.ucls ├── Command.ucls ├── Composite.ucls ├── Decorator.ucls ├── Facade.ucls ├── Factory.ucls ├── Flyweight.ucls ├── Interpreter.ucls ├── Iterator.ucls ├── Mediator.ucls ├── Memento.ucls ├── Observer.ucls ├── SimpleFactory.ucls ├── Singleton.ucls ├── State.ucls ├── Strategy.ucls ├── Template.ucls ├── Visitor.ucls ├── prototype.ucls └── proxy.ucls /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /bin/ 2 | /README.md 3 | /.gitignore 4 | /README.md 5 | /README.md 6 | /README.md 7 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | BigTalkDesignPattern 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.sirius.nature.modelingproject 16 | org.eclipse.jdt.core.javanature 17 | 18 | 19 | -------------------------------------------------------------------------------- /.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=1.8 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 11 | org.eclipse.jdt.core.compiler.source=1.8 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bigTalkDesignPatternJava 設計模式 2 | 3 | 學習設計模式過程中見過不少其他語言的的範例程式,這邊用java重新寫過一次幫助自己理解各種設計模式的用法, 4 | 重寫一次花了不少時間,留個紀錄。 5 | -------------------------------------------------------------------------------- /client/c01/simpleFactory/CalculatorClient.java: -------------------------------------------------------------------------------- 1 | package c01.simpleFactory; 2 | 3 | /** 4 | * 計算機-客戶端(簡單工廠模式 )
5 | * calculatorA()是測試沒有使用簡單工廠模式的計算機
6 | * CalculatorFactory()是使用簡單工廠模式的計算機 7 | * @author Yan 8 | * 9 | */ 10 | public class CalculatorClient { 11 | public static void main(String[] args) { 12 | calculatorA(); 13 | CalculatorFactory(); 14 | } 15 | 16 | /** 17 | * 業物邏輯與UI拆開的簡易計算機測試 18 | */ 19 | public static void calculatorA(){ 20 | System.out.println(">>>> calculatorA 測試 <<<< "); 21 | 22 | // 輸入值 23 | Integer numberA = 10; 24 | Integer numberB = 2; 25 | char operator = '+'; 26 | 27 | try { 28 | // 計算並輸出 29 | System.out.println("輸入:" + numberA + operator + numberB ); 30 | CalculatorA calculator = new CalculatorA(); 31 | int result = calculator.calculate(numberA, numberB, operator); 32 | System.out.println("計算結果:" + numberA + operator + numberB + "=" + result); 33 | } catch (Exception e) { 34 | e.printStackTrace(); 35 | } 36 | } 37 | 38 | /** 39 | * 使用簡單工廠模式(SimpleFactory Pattern)實現簡易計算機 40 | */ 41 | public static void CalculatorFactory(){ 42 | System.out.println(">>>> CalculatorFactory 測試 <<<< "); 43 | 44 | // 輸入值 45 | Integer numberA = 10; 46 | Integer numberB = 2; 47 | char operator = '-'; 48 | 49 | try { 50 | System.out.println("輸入:" + numberA + operator + numberB ); 51 | Calculator calculator = CalculatorFactory.getCalculator(operator); 52 | calculator.setNumber(numberA, numberB); 53 | int result = calculator.getResult(); 54 | System.out.println("計算結果:" + numberA + operator + numberB + "=" + result); 55 | } catch (Exception e) { 56 | e.printStackTrace(); 57 | } 58 | 59 | 60 | } 61 | 62 | } 63 | -------------------------------------------------------------------------------- /client/c01/simpleFactory/CashFactoryClient.java: -------------------------------------------------------------------------------- 1 | package c01.simpleFactory; 2 | 3 | import org.junit.Test; 4 | 5 | import c02.strategy.simpleFactory.CashFactory; 6 | import c02.strategy.simpleFactory.CashSuper; 7 | 8 | /** 9 | * 商場收銀客戶端(簡單工廠)
10 | * @author Yan 11 | * 12 | */ 13 | public class CashFactoryClient { 14 | 15 | @Test 16 | public void CashFactoryTest(){ 17 | int count = 5; //數量 18 | int price = 100; //價錢 19 | String type = "normal"; 20 | //type = "discount85"; 21 | //type = "return300n100"; 22 | 23 | // 簡單工廠模式,客戶端程式需知道 CashSuper與 CashFactory兩個類別 24 | CashSuper csN = CashFactory.createCashAccept(type); 25 | 26 | int totalN = csN.acceptCash(count*price); 27 | System.out.println("買了:" + count*price + "收費模式normal 需收費:" + totalN ); 28 | } 29 | 30 | 31 | 32 | } 33 | -------------------------------------------------------------------------------- /client/c02/strategy/CashClient.java: -------------------------------------------------------------------------------- 1 | package c02.strategy; 2 | 3 | import org.junit.Test; 4 | 5 | import c02.strategy.CashContext; 6 | import c02.strategy.CashContextPro; 7 | import c02.strategy.simpleFactory.CashDiscount; 8 | import c02.strategy.simpleFactory.CashNomal; 9 | import c02.strategy.simpleFactory.CashReturn; 10 | /** 11 | * 收銀櫃檯-客戶端(策略模式) 12 | * @author Yan 13 | * 14 | */ 15 | public class CashClient { 16 | public static void main(String[] args) { 17 | CashContextTest(); 18 | CashContextProTest(); 19 | } 20 | 21 | /** 22 | * 策略模式 23 | */ 24 | public static void CashContextTest(){ 25 | int count = 5; //數量 26 | int price = 100; //價錢 27 | double discount = 0.9; 28 | 29 | // 與工廠模式相同,客戶端程式需傳入收費方式字串 30 | String type = "discount"; 31 | CashContext cct = null; 32 | 33 | // 因為這樣又把switch case的程式暴露在客戶端程式,因此需要把判斷程式搬到Context內,將策略模式與工廠模式結合 34 | switch(type) { 35 | case "normal": cct = new CashContext(new CashNomal()); break; 36 | case "discount": cct = new CashContext(new CashDiscount(discount)); break; 37 | case "return": cct = new CashContext(new CashReturn(300,100));break; 38 | } 39 | System.out.println("========策略模式=========="); 40 | 41 | System.out.println("買了:" + count*price + " 收費模式" + type +" 需收費:" + cct.GetResult(price*count) ); 42 | 43 | } 44 | 45 | @Test 46 | /** 47 | * 結合策略模式與工廠模式 48 | */ 49 | public static void CashContextProTest(){ 50 | int count = 5; //數量 51 | int price = 100; //價錢 52 | String type = "discount"; 53 | CashContextPro cct = new CashContextPro(type); 54 | System.out.println("========結合策略模式與工廠模式=========="); 55 | System.out.println("買了:" + count*price + " 收費模式" + type +" 需收費:" + cct.GetResult(price*count) ); 56 | 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /client/c06/decorator/DecoratorClient.java: -------------------------------------------------------------------------------- 1 | package c06.decorator; 2 | /** 3 | * 打扮-客戶端(裝飾模式) 4 | * @author Yan 5 | * 6 | */ 7 | public class DecoratorClient { 8 | public static void main(String[] args) { 9 | Person xc = new Person("小菜"); 10 | 11 | 12 | Finery sneakers = new Sneakers(); 13 | sneakers.decorate(xc); 14 | 15 | Finery trouser = new Trouser(sneakers); 16 | Finery tShirts = new TShirts(trouser); 17 | 18 | 19 | //trouser.decorate(sneakers); 20 | //tShirts.decorate(trouser); 21 | tShirts.show(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /client/c07/proxy/ProxyClient.java: -------------------------------------------------------------------------------- 1 | package c07.proxy; 2 | 3 | import c07.proxy.Proxy; 4 | import c07.proxy.Pursuit; 5 | import c07.proxy.SchoolGirl; 6 | 7 | /** 8 | * 代理人幫人送禮物-客戶端(代理模式) 9 | * @author Yan 10 | * 11 | */ 12 | public class ProxyClient { 13 | public static void main(String[] args) { 14 | SchoolGirl girl = new SchoolGirl(); 15 | girl.name = "校花Sarah"; 16 | 17 | // 以下程式碼實現 "戴笠哥幫魯什弟"送禮物給校花Sarah" 18 | Pursuit ps = new Pursuit("魯什弟"); 19 | ps.setSchoolGirl(girl); 20 | Proxy proxy = new Proxy(ps, "戴笠哥"); 21 | proxy.giveChocolate(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /client/c08/factory/NightingaleClient.java: -------------------------------------------------------------------------------- 1 | package c08.factory; 2 | 3 | import c08.factory.IFactory; 4 | import c08.factory.Nightingale; 5 | import c08.factory.SimpleFactory; 6 | import c08.factory.VolunteerFactory; 7 | 8 | /** 9 | * 南丁格爾老人服務團-客戶端(工廠模式) 10 | * @author Yan 11 | * 12 | */ 13 | public class NightingaleClient { 14 | public static void main(String[] args) { 15 | // 大學生跑去幫助老人,使用simple factory 16 | undergraduateDoHelp(); 17 | 18 | // 社區義工幫助老人,使用factory 19 | volunteerDoHelp(); 20 | } 21 | 22 | /** 23 | * 使用Factory,優點是當有新的物件類別,或是需要修改現有類別產生方式時,不用修改到Factory 24 | */ 25 | private static void volunteerDoHelp() { 26 | IFactory factory = new VolunteerFactory(); 27 | Nightingale volunteer = factory.CreateNightingale(); 28 | volunteer.buyRice(); 29 | } 30 | 31 | 32 | /** 33 | * 使用simple factory產生幫助老人的物件,如果要修改產生物件的方法,需要修改simple factory程式碼 34 | */ 35 | public static void undergraduateDoHelp(){ 36 | Nightingale student = SimpleFactory.CreatNightingale("undergraduate"); 37 | System.out.println("社區大學生幫助老人:"); 38 | student.buyRice(); 39 | student.sweep(); 40 | student.wash(); 41 | 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /client/c09/prototype/ResumeClient.java: -------------------------------------------------------------------------------- 1 | package c09.prototype; 2 | 3 | import c09.prototype.Resume; 4 | 5 | /** 6 | * 履歷-客戶端 (原型模式) 7 | * @author Yan 8 | * 9 | */ 10 | public class ResumeClient { 11 | public static void main(String[] args) throws CloneNotSupportedException { 12 | Resume resume = new Resume("Yan"); 13 | resume.setProfile("31", "master"); 14 | resume.setWorkExperience("2016-2019", "FOYA"); 15 | 16 | // 履歷表2跟1有許多相似的地方,因此直接複製履歷表1做修改 17 | Resume resume2 = (Resume) resume.clone(); 18 | resume2.setWorkExperience("2011-2016", "IISI"); 19 | 20 | // 履歷表3跟1有許多相似的地方,因此直接複製履歷表1做修改 21 | Resume resume3 = (Resume) resume.clone(); 22 | resume3.setProfile("21", "bachelor"); 23 | resume3.setWorkExperience("2005-2011", "TMD"); 24 | 25 | resume.display(); 26 | resume2.display(); 27 | resume3.display(); 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /client/c10/template/TestPaperClient.java: -------------------------------------------------------------------------------- 1 | package c10.template; 2 | 3 | import c10.template.TestPaper; 4 | import c10.template.TestPaperA; 5 | import c10.template.TestPaperB; 6 | 7 | /** 8 | * 考試卷-客戶端(範本模式)
9 | * 一開始TestPaper類別就已經實作出題的method QuestionA(), QuestionB(), QuestionC()
10 | * 也實作了印出整張考卷做答與題目的method display()
11 | * 因此真正發給學生的考卷TestPaperA, TestPaperB只要實現寫答案的method answerA(), answerB(), answerC()即可 12 | * @author Yan 13 | * 14 | */ 15 | public class TestPaperClient { 16 | public static void main(String[] args) { 17 | System.out.println("學生A的試卷"); 18 | TestPaper paperA = new TestPaperA(); 19 | paperA.display(); 20 | 21 | System.out.println(); 22 | System.out.println("學生B的試卷"); 23 | TestPaper paperB = new TestPaperB(); 24 | paperB.display(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /client/c12/facade/FundClient.java: -------------------------------------------------------------------------------- 1 | package c12.facade; 2 | 3 | import c12.facade.Fund; 4 | /** 5 | * 基金-客戶端(外觀模式)
6 | * 外觀模式將 7 | * @author Yan 8 | * 9 | */ 10 | public class FundClient { 11 | public static void main(String[] args) { 12 | Fund fund = new Fund(); 13 | fund.buyFund(); 14 | fund.sellFund(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /client/c13/builder/PersonBuilderClient.java: -------------------------------------------------------------------------------- 1 | package c13.builder; 2 | 3 | import c13.builder.GundamBuilder; 4 | import c13.builder.LinePersonBuilder; 5 | import c13.builder.PersonDirector; 6 | 7 | /** 8 | * 畫小人-客戶端(建造者模式) 9 | * builder pattern 與 factory pattern的差異處
10 | * factory pattern 關注一個物件如何產生
11 | * builder pattern 關注一個由各種零組件組合的物件如何產生 12 | * @author Yan 13 | * 14 | */ 15 | public class PersonBuilderClient { 16 | public static void main(String[] args) { 17 | PersonDirector pd = new PersonDirector(); 18 | 19 | // director 用 createPersonFromLeg 從腳到頭畫一個線條人 20 | LinePersonBuilder lpb = new LinePersonBuilder(); 21 | pd.setPersonBuilder(lpb); 22 | pd.createPersonFromLeg(); 23 | 24 | System.out.println(); 25 | 26 | // director 用 createPersonFromHead 從頭到腳畫一個線鋼彈 27 | GundamBuilder gb = new GundamBuilder(); 28 | pd.setPersonBuilder(gb); 29 | pd.createPersonFromHead(); 30 | 31 | 32 | 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /client/c14/observer/BossNotifyClient.java: -------------------------------------------------------------------------------- 1 | package c14.observer; 2 | 3 | import c14.observer.Boss; 4 | import c14.observer.NBAObserver; 5 | import c14.observer.Observer; 6 | import c14.observer.Secretary; 7 | import c14.observer.StockObserver; 8 | import c14.observer.Subject; 9 | 10 | /** 11 | * 老闆回來通知-客戶端(觀察者模式) 12 | * @author Yan 13 | * 14 | */ 15 | public class BossNotifyClient { 16 | public static void main(String[] args) { 17 | Subject boss = new Boss(); 18 | 19 | 20 | Subject xiaoMei = new Secretary(); 21 | 22 | Observer sob = new StockObserver("小股民", xiaoMei); 23 | Observer loser = new NBAObserver("NBA魯什", xiaoMei); 24 | // 沒人通知的情況下,小員工直接被老闆抓包 25 | System.out.println("小股民看股票中,NBA魯什看NBA中---老闆突然回來了"); 26 | boss.attach(sob); 27 | boss.attach(loser); 28 | boss.notifyObserver("上班不上班,等等來辦公室找我"); 29 | 30 | System.out.println("=============拜託櫃台小姐通知老闆回來了============="); 31 | xiaoMei.attach(sob); 32 | xiaoMei.attach(loser); 33 | // 報明牌失準,小美表示不想通知小股民了 34 | xiaoMei.detach(sob); 35 | xiaoMei.notifyObserver("老闆回來拉!!!"); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /client/c15/abstractFactory/DaoClient.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | 3 | import c15.abstractFactory.Department; 4 | import c15.abstractFactory.IDeptDao; 5 | import c15.abstractFactory.IFactory; 6 | import c15.abstractFactory.IUserDao; 7 | import c15.abstractFactory.OracleDaoFactory; 8 | import c15.abstractFactory.SqlServerDaoFactory; 9 | import c15.abstractFactory.User; 10 | 11 | /** 12 | * 資料庫操作DAO-客戶端(抽象工廠模式)
13 | * 工廠模式中毎一個產品都要有專門的工廠來生產
14 | * 在抽象工廠模式中,將同族系(例如說部門-員工)的產品集中由一個工廠生產,因此抽像工廠製造的不是一種產品,而是生成一組產品 15 | * @author Yan 16 | * 17 | */ 18 | public class DaoClient { 19 | public static void main(String[] args) { 20 | //取得存取oracle的Dao 21 | IFactory factory = new OracleDaoFactory(); 22 | IUserDao userDao = factory.createUserDao(); 23 | IDeptDao deptDao = factory.createDeptDao(); 24 | 25 | userDao.insert(new User(1,"")); 26 | userDao.getUser(1); 27 | 28 | deptDao.insert(new Department(2,"")); 29 | deptDao.getDept(2); 30 | 31 | System.out.println(); 32 | 33 | //換成存取 sql server 34 | factory = new SqlServerDaoFactory(); 35 | userDao = factory.createUserDao(); 36 | deptDao = factory.createDeptDao(); 37 | userDao.insert(new User(111,"")); 38 | userDao.getUser(111); 39 | 40 | deptDao.insert(new Department(222,"")); 41 | deptDao.getDept(222); 42 | 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /client/c16/state/StateClient.java: -------------------------------------------------------------------------------- 1 | package c16.state; 2 | 3 | import c16.state.Work; 4 | 5 | /** 6 | * 上班狀態-客戶端(狀態模式) 7 | * @author Yan 8 | * 9 | */ 10 | public class StateClient { 11 | public static void main(String[] args) { 12 | Work emergencyProject = new Work(); 13 | emergencyProject.setHour(9); 14 | emergencyProject.writeProgram(); 15 | emergencyProject.setHour(10); 16 | emergencyProject.writeProgram(); 17 | emergencyProject.setHour(11); 18 | emergencyProject.writeProgram(); 19 | emergencyProject.setHour(12); 20 | emergencyProject.writeProgram(); 21 | emergencyProject.setHour(15); 22 | emergencyProject.writeProgram(); 23 | emergencyProject.setFinish(true); 24 | 25 | emergencyProject.setHour(18); 26 | emergencyProject.writeProgram(); 27 | 28 | emergencyProject.setHour(19); 29 | emergencyProject.writeProgram(); 30 | emergencyProject.setHour(21); 31 | emergencyProject.writeProgram(); 32 | 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /client/c17/adapter/TranslatorClient.java: -------------------------------------------------------------------------------- 1 | package c17.adapter; 2 | 3 | import c17.adapter.CenterPlayer; 4 | import c17.adapter.Player; 5 | import c17.adapter.Translator; 6 | 7 | /** 8 | * NBA翻譯-客戶端(轉接器模式) 9 | * @author Yan 10 | * 11 | */ 12 | public class TranslatorClient { 13 | public static void main(String[] args) { 14 | Player b = new CenterPlayer("bill"); 15 | b.attack(); 16 | 17 | Player ym = new Translator("姚明"); 18 | ym.attack(); 19 | ym.defense(); 20 | 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /client/c18/memento/GameRoleClient.java: -------------------------------------------------------------------------------- 1 | package c18.memento; 2 | 3 | import c18.memento.GameRole; 4 | import c18.memento.RoleStateCareTaker; 5 | 6 | /** 7 | * 打魔王遊戲-客戶端(備忘錄模式) 8 | * @author Yan 9 | * 10 | */ 11 | public class GameRoleClient { 12 | 13 | public static void main(String[] args) { 14 | // boss一開始的狀態 15 | GameRole boss = new GameRole(); 16 | boss.stateDisplay(); 17 | 18 | 19 | // 使用複雜的神秘小技巧,可以降低boss攻擊力 20 | System.out.println("使用複雜的神秘小技巧"); 21 | boss.setAtk(60); 22 | 23 | // 趕快存檔 24 | RoleStateCareTaker rsc = new RoleStateCareTaker(); 25 | rsc.setSave(boss.save()); 26 | boss.stateDisplay(); 27 | 28 | 29 | // 開打了 30 | boss.fight(); 31 | boss.stateDisplay(); 32 | 33 | // 隊伍血沒先回滿,倒了一半,快讀取剛才的存檔 34 | boss.load(rsc.getSave()); 35 | System.out.println("不行不行,讀檔重打"); 36 | boss.stateDisplay(); 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /client/c19/composite/CompanyClient.java: -------------------------------------------------------------------------------- 1 | package c19.composite; 2 | /** 3 | * 公司組織-客戶端(組合模式) 4 | * @author Yan 5 | * 6 | */ 7 | public class CompanyClient { 8 | public static void main(String[] args) { 9 | Company root = new ConcreteCompany("月球總部"); 10 | root.add(new HRDept("總部人力資源處")); 11 | root.add(new FinaneDept("總部財務處")); 12 | 13 | Company mars = new ConcreteCompany("火星分部"); 14 | mars.add(new HRDept("火星分部人力資源處")); 15 | mars.add(new FinaneDept("火星分部財務處")); 16 | root.add(mars); 17 | 18 | Company m1 = new ConcreteCompany("火衛1號辦事處"); 19 | m1.add(new HRDept("火衛1號辦事處人事室")); 20 | m1.add(new FinaneDept("火衛1號辦事處會計室")); 21 | mars.add(m1); 22 | 23 | Company m2 = new ConcreteCompany("火衛2號辦事處"); 24 | m2.add(new HRDept("火衛2號辦事處人事室")); 25 | m2.add(new FinaneDept("火衛2號辦事處會計室")); 26 | mars.add(m2); 27 | 28 | System.out.println("結構圖:"); 29 | root.display(1); 30 | System.out.println("職責表"); 31 | root.lineOfDuty(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /client/c20/iterator/IteratorClient.java: -------------------------------------------------------------------------------- 1 | package c20.iterator; 2 | /** 3 | * 公車買票-客戶端(迭代器模式) 4 | * @author Yan 5 | * 6 | */ 7 | public class IteratorClient { 8 | public static void main(String[] args) { 9 | Aggregate a = new ConcreteAggregate<>(); 10 | a.add("鳥哥"); 11 | a.add("蔡蟲"); 12 | a.add("吉他"); 13 | a.add("內部員工"); 14 | a.add("小偷"); 15 | 16 | Iterator it = new ConcreteIterator<>(a); 17 | while(it.isDone()){ 18 | System.out.println(it.currentItem() + " 買票!"); 19 | it.next(); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /client/c21/singleton/SingletonClient.java: -------------------------------------------------------------------------------- 1 | package c21.singleton; 2 | 3 | /** 4 | * singleton客戶端(單例模式) 5 | * @author Yan 6 | * 7 | */ 8 | public class SingletonClient { 9 | public static void main(String[] args) { 10 | Singleton s1 = Singleton.getInstance(); 11 | Singleton s2 = Singleton.getInstance(); 12 | 13 | if(s1 == s2){ 14 | System.out.println("兩個是同一個物件"); 15 | }; 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /client/c22/bridge/HandsetClient.java: -------------------------------------------------------------------------------- 1 | package c22.bridge; 2 | /** 3 | * 手機軟體-客戶端(橋接模式) 4 | * @author Yan 5 | * 6 | */ 7 | public class HandsetClient { 8 | public static void main(String[] args) { 9 | HandsetBrand hb; 10 | //M牌手機 11 | hb = new HandsetBrandM(); 12 | hb.setHandsetSoft(new HandsetGame()); 13 | hb.run(); 14 | hb.setHandsetSoft(new HandsetContactList()); 15 | hb.run(); 16 | System.out.println(); 17 | 18 | //N牌手機 19 | hb = new HandsetBrandN(); 20 | hb.setHandsetSoft(new HandsetGame()); 21 | hb.run(); 22 | hb.setHandsetSoft(new HandsetContactList()); 23 | hb.run(); 24 | 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /client/c23/command/BarbecueClient.java: -------------------------------------------------------------------------------- 1 | package c23.command; 2 | /** 3 | * 燒烤店-客戶端(命令模式) 4 | * @author Yan 5 | * 6 | */ 7 | public class BarbecueClient { 8 | 9 | public static void main(String[] args) { 10 | //開店前準備 11 | Barbecuer boy = new Barbecuer(); 12 | Command bakeMutton = new BakeMutonCommand(boy); 13 | Command bakeChicken = new BakeChickenWingCommand(boy); 14 | Waiter girl = new Waiter(); 15 | 16 | //開始營業 客戶點餐 17 | girl.setOrder(bakeMutton); 18 | girl.setOrder(bakeMutton); 19 | girl.setOrder(bakeChicken); 20 | girl.setOrder(bakeChicken); 21 | // 雞翅賣完 22 | girl.setOrder(bakeChicken); 23 | girl.setOrder(bakeMutton); 24 | // 取消一個雞翅 25 | girl.cancelOrder(bakeChicken); 26 | 27 | girl.setOrder(bakeChicken); 28 | 29 | // 雞翅又賣完了 30 | girl.setOrder(bakeChicken); 31 | girl.setOrder(bakeMutton); 32 | System.out.println(); 33 | // 點餐完成,烤肉 34 | girl.notifyBaker(); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /client/c24/ChainOfResponsibility/ManagerClient.java: -------------------------------------------------------------------------------- 1 | package c24.ChainOfResponsibility; 2 | /** 3 | * 公司請假,加薪簽核-客戶端(職責鏈模式) 4 | * @author Yan 5 | * 6 | */ 7 | public class ManagerClient { 8 | 9 | 10 | public static void main(String[] args) { 11 | Manager pm = new CommonManager("PM經理"); 12 | Manager gl = new Majordomo("總監"); 13 | Manager gm = new GeneralManager("總經理"); 14 | 15 | // 設定上級,可隨實際需求更改 16 | pm.setSuperior(gl); 17 | gl.setSuperior(gm); 18 | 19 | ApplyRequest request = new ApplyRequest(); 20 | request.setRequestType("請假"); 21 | request.setRequestContent("小菜請假"); 22 | request.setRequestCount(2); 23 | pm.apply(request); 24 | 25 | request.setRequestCount(4); 26 | pm.apply(request); 27 | 28 | request.setRequestType("加薪"); 29 | request.setRequestContent("小菜加薪"); 30 | request.setRequestCount(2000); 31 | pm.apply(request); 32 | 33 | request.setRequestCount(900); 34 | pm.apply(request); 35 | 36 | 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /client/c25/mediator/UniteNationsClient.java: -------------------------------------------------------------------------------- 1 | package c25.mediator; 2 | /** 3 | * 聯合國-客戶端(中介者模式) 4 | * @author Yan 5 | * 6 | */ 7 | public class UniteNationsClient { 8 | 9 | 10 | public static void main(String[] args) { 11 | UNSC unsc = new UNSC(); 12 | USA c1 = new USA(unsc); 13 | Iraq c2 = new Iraq(unsc); 14 | 15 | unsc.setCountryA(c1); 16 | unsc.setCountryB(c2); 17 | 18 | c1.declare("快把海珊交出來"); 19 | c2.declare("海珊昨天被你們炸死了"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /client/c26/flyweight/WebsiteClient.java: -------------------------------------------------------------------------------- 1 | package c26.flyweight; 2 | 3 | import c26.flywight.User; 4 | import c26.flywight.WebSiteFactory; 5 | import c26.flywight.Website; 6 | 7 | /** 8 | * 網站服務-客戶端(享元模式) 9 | * @author Yan 10 | * 11 | */ 12 | public class WebsiteClient { 13 | 14 | public static void main(String[] args) { 15 | WebSiteFactory f = new WebSiteFactory(); 16 | 17 | //產品展示網站有兩個,但是他們其實只是共用一個物件 18 | Website pd = f.getWebsiteCategory("產品展示"); 19 | pd.use(new User("小菜")); 20 | Website pd2 = f.getWebsiteCategory("產品展示"); 21 | pd2.use(new User("大鳥")); 22 | Website blog = f.getWebsiteCategory("部落格"); 23 | blog.use(new User("部落客")); 24 | Website ts = f.getWebsiteCategory("教學網站"); 25 | ts.use(new User("陳老師")); 26 | 27 | System.out.println("目前共有" + f.getWebsiteCount() + "種網站"); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /client/c27/interpreter/ContextPlayClient.java: -------------------------------------------------------------------------------- 1 | package c27.interpreter; 2 | /** 3 | * 樂譜解析-客戶端(解譯器模式) 4 | * @author Yan 5 | * 6 | */ 7 | public class ContextPlayClient { 8 | public static void main(String[] args) { 9 | PlayContext context = new PlayContext(); 10 | context.setText("O 2 E 0.5 G 0.5 A 3 "); 11 | 12 | Expression expression = null; 13 | 14 | while(context.getText().length() > 0){ 15 | String str = context.getText().substring(0, 1); 16 | if("O".equals(str)){ 17 | expression = new Scale(); 18 | } else { 19 | expression = new Note(); 20 | } 21 | 22 | expression.interpret(context); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /client/c28/visitor/PersonActionClient.java: -------------------------------------------------------------------------------- 1 | package c28.visitor; 2 | /** 3 | * 男人女人對比-客戶端(拜訪者模式) 4 | * @author Yan 5 | * 6 | */ 7 | public class PersonActionClient { 8 | public static void main(String[] args) { 9 | ObjectStructure os = new ObjectStructure(); 10 | os.attach(new Man()); 11 | os.attach(new Woman()); 12 | 13 | Action success = new Success(); 14 | os.display(success);; 15 | 16 | Action failure = new Failing(); 17 | os.display(failure);; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/c01/simpleFactory/Calculator.java: -------------------------------------------------------------------------------- 1 | package c01.simpleFactory; 2 | 3 | /** 4 | * 毎一種計算邏輯(+,-,*,/)各自獨立抽出一個"計算class",Calculator class規範"計算class"應該有哪些方法 5 | * @author Yan 6 | * 7 | */ 8 | public abstract class Calculator { 9 | protected int numberA = 0; 10 | protected int numberB = 0; 11 | 12 | public void setNumber(int a, int b){ 13 | numberA = a; 14 | numberB = b; 15 | } 16 | 17 | /** 18 | * 這個方法需要被overwrite,計算的方法請在這邊實作 19 | * @return 20 | */ 21 | public abstract int getResult(); 22 | } 23 | -------------------------------------------------------------------------------- /src/c01/simpleFactory/CalculatorA.java: -------------------------------------------------------------------------------- 1 | package c01.simpleFactory; 2 | 3 | /** 4 | * 簡單的計算機,只留下計算(業物邏輯)的部分。UI介面顯示則交由client端(CalculatorTest)處理 5 | * 優點是開發迅速。 6 | * 缺點是如果要新增計算方法,例如說新增a^b的計算方法, 7 | * 這樣就要進來修改計算邏輯的程式,不符合開放-關閉的開發模式。 8 | * 如果將+,-,*,/這些方法各字抽出成為一個運算類別, 9 | * 這樣開發人員要新增計算方法只要新增類別就可以,不會也不需要看到+,-,*,/這些運算類別裡面寫什麼 10 | * @author Yan 11 | */ 12 | public class CalculatorA { 13 | private static int result; 14 | 15 | /** 16 | * 計算方法,輸入數字a,b,運算方法operator,進行相對應的計算 17 | * @param a 18 | * @param b 19 | * @param operate 20 | * @return 21 | * @throws Exception 22 | */ 23 | public int calculate(Integer a, Integer b, char operator) throws Exception{ 24 | switch(operator){ 25 | case '+' : result = a+b; break; 26 | case '-' : result = a-b; break; 27 | case '*' : result = a*b; break; 28 | case '/' : result = a/b; break; 29 | default : throw new Exception("輸入錯誤"); 30 | } 31 | return result; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/c01/simpleFactory/CalculatorFactory.java: -------------------------------------------------------------------------------- 1 | package c01.simpleFactory; 2 | 3 | /** 4 | * SimpleFactory Pattern 5 | * 使用Calculator Factory來產生對應的計算類別
6 | * 缺點是程式碼被拆的很散,不是適合簡單的小功能
7 | * 優點是容易擴充與維護,因為毎個計算類別都是獨立的 8 | * 因此寫程式的人只要專注在一個計算類別是就好
9 | * 要擴充時也只要新增類別,並且來這個SimpleFactory增加switch選相即可 10 | * @author Yan 11 | * 12 | */ 13 | public class CalculatorFactory { 14 | 15 | 16 | public static Calculator getCalculator(char operator) throws Exception{ 17 | Calculator calculator = null; 18 | switch(operator){ 19 | case '+' : calculator = new CalulatorAdd(); break; 20 | case '-' : calculator = new CalulatorSub(); break; 21 | case '*' : calculator = new CalulatorMul(); break; 22 | case '/' : calculator = new CalulatorDiv(); break; 23 | default : throw new Exception("輸入錯誤"); 24 | } 25 | 26 | return calculator; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/c01/simpleFactory/CalulatorAdd.java: -------------------------------------------------------------------------------- 1 | package c01.simpleFactory; 2 | 3 | /** 4 | * 加法計算 5 | * @author Yan 6 | * 7 | */ 8 | public class CalulatorAdd extends Calculator { 9 | @Override 10 | public int getResult() { 11 | return numberA+numberB; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/c01/simpleFactory/CalulatorDiv.java: -------------------------------------------------------------------------------- 1 | package c01.simpleFactory; 2 | 3 | /** 4 | * 除法計算 5 | * @author Yan 6 | * 7 | */ 8 | public class CalulatorDiv extends Calculator { 9 | @Override 10 | public int getResult() { 11 | return numberA/numberB; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/c01/simpleFactory/CalulatorMul.java: -------------------------------------------------------------------------------- 1 | package c01.simpleFactory; 2 | 3 | /** 4 | * 乘法計算 5 | * @author Yan 6 | * 7 | */ 8 | public class CalulatorMul extends Calculator { 9 | @Override 10 | public int getResult() { 11 | return numberA*numberB; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/c01/simpleFactory/CalulatorSub.java: -------------------------------------------------------------------------------- 1 | package c01.simpleFactory; 2 | 3 | /** 4 | * 減法計算 5 | * @author Yan 6 | * 7 | */ 8 | public class CalulatorSub extends Calculator { 9 | @Override 10 | public int getResult() { 11 | return numberA-numberB; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/c02/strategy/CashContext.java: -------------------------------------------------------------------------------- 1 | package c02.strategy; 2 | 3 | import c02.strategy.simpleFactory.CashSuper; 4 | 5 | public class CashContext { 6 | private CashSuper cs; 7 | 8 | public CashContext(CashSuper cs){ 9 | this.cs = cs; 10 | } 11 | 12 | public int GetResult(int money){ 13 | return cs.acceptCash(money); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/c02/strategy/CashContextPro.java: -------------------------------------------------------------------------------- 1 | package c02.strategy; 2 | 3 | import c02.strategy.simpleFactory.CashDiscount; 4 | import c02.strategy.simpleFactory.CashNomal; 5 | import c02.strategy.simpleFactory.CashReturn; 6 | import c02.strategy.simpleFactory.CashSuper; 7 | 8 | public class CashContextPro { 9 | private CashSuper cs; 10 | 11 | public CashContextPro(String type){ 12 | switch(type) { 13 | case "normal": cs = new CashNomal(); break; 14 | case "discount": cs = new CashDiscount(0.8); break; 15 | case "return": cs =new CashReturn(300,100);break; 16 | } 17 | } 18 | 19 | public int GetResult(int money){ 20 | return cs.acceptCash(money); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/c02/strategy/simpleFactory/CashDiscount.java: -------------------------------------------------------------------------------- 1 | package c02.strategy.simpleFactory; 2 | 3 | public class CashDiscount extends CashSuper{ 4 | private double discount ; 5 | 6 | @SuppressWarnings("unused") 7 | private CashDiscount(){}; 8 | 9 | /** 10 | * 建立本類別時一定要傳入折扣 11 | * @param discount 12 | */ 13 | public CashDiscount(double discount){ 14 | this.discount = discount; 15 | } 16 | 17 | @Override 18 | /** 19 | * 打折收費,收費 = 原價*折扣 20 | */ 21 | public int acceptCash(int money) { 22 | return (int) Math.round(money*discount); 23 | } 24 | 25 | 26 | } 27 | -------------------------------------------------------------------------------- /src/c02/strategy/simpleFactory/CashFactory.java: -------------------------------------------------------------------------------- 1 | package c02.strategy.simpleFactory; 2 | 3 | public class CashFactory{ 4 | 5 | /** 6 | * 收費方式工廠,根據傳入的參數決定要建立出哪種收費模式 7 | */ 8 | public static CashSuper createCashAccept(String type) { 9 | CashSuper cs = null; 10 | switch(type) { 11 | case "normal": cs = new CashNomal(); break; 12 | case "discount85": cs = new CashDiscount(0.85); break; 13 | case "return300n100": cs = new CashReturn(300,100);break; 14 | } 15 | return cs; 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /src/c02/strategy/simpleFactory/CashNomal.java: -------------------------------------------------------------------------------- 1 | package c02.strategy.simpleFactory; 2 | 3 | public class CashNomal extends CashSuper{ 4 | @Override 5 | /** 6 | * 正常收費,應該收多少錢就收多少錢 7 | */ 8 | public int acceptCash(int money) { 9 | return money; 10 | } 11 | 12 | 13 | } 14 | -------------------------------------------------------------------------------- /src/c02/strategy/simpleFactory/CashReturn.java: -------------------------------------------------------------------------------- 1 | package c02.strategy.simpleFactory; 2 | 3 | public class CashReturn extends CashSuper{ 4 | private double moneyCoundition; 5 | private double moneyReturn; 6 | 7 | public CashReturn(double moneyCoundition, double moneyReturn){ 8 | this.moneyCoundition = moneyCoundition; 9 | this.moneyReturn = moneyReturn; 10 | } 11 | 12 | @Override 13 | /** 14 | * 紅利收費,利如說滿300送100 15 | */ 16 | public int acceptCash(int money) { 17 | int result = money; 18 | 19 | // 收的錢比設定的條件還大,扣掉紅利優惠 20 | if(money > moneyCoundition){ 21 | result = (int) (money - Math.floor(money/moneyCoundition)*moneyReturn); 22 | } 23 | return result; 24 | } 25 | 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/c02/strategy/simpleFactory/CashSuper.java: -------------------------------------------------------------------------------- 1 | package c02.strategy.simpleFactory; 2 | 3 | /** 4 | * 商場收銀軟體,根據客戶所購買的商品與數量收費 5 | * @author Yan 6 | * 7 | */ 8 | public abstract class CashSuper { 9 | /** 10 | * 各種收費規則的抽像類別,利如正常收費則acceptCash要回傳的就是原價 11 | * @param money 12 | * @return 13 | */ 14 | public abstract int acceptCash(int money); 15 | } 16 | -------------------------------------------------------------------------------- /src/c06/decorator/Finery.java: -------------------------------------------------------------------------------- 1 | package c06.decorator; 2 | /** 3 | * 服飾類別 4 | * @author Yan 5 | * 6 | */ 7 | public class Finery extends Person { 8 | protected Person component; 9 | public Finery(){ 10 | 11 | } 12 | 13 | public Finery(Person p){ 14 | this.component = p; 15 | } 16 | 17 | //打扮 18 | public void decorate(Person p){ 19 | this.component = p; 20 | } 21 | 22 | @Override 23 | public void show() { 24 | if(component != null){ 25 | component.show(); 26 | } 27 | } 28 | } 29 | 30 | -------------------------------------------------------------------------------- /src/c06/decorator/Person.java: -------------------------------------------------------------------------------- 1 | package c06.decorator; 2 | /** 3 | * 一開始還沒裝扮的人 4 | * @author Yan 5 | * 6 | */ 7 | public class Person { 8 | private String name; 9 | public Person(){ 10 | 11 | } 12 | 13 | public Person(String name){ 14 | this.name = name; 15 | } 16 | 17 | public void show(){ 18 | System.out.println("裝扮的" + name); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/c06/decorator/Sneakers.java: -------------------------------------------------------------------------------- 1 | package c06.decorator; 2 | /** 3 | * 服飾類別 4 | * @author Yan 5 | * 6 | */ 7 | public class Sneakers extends Finery { 8 | public Sneakers(){ 9 | 10 | } 11 | 12 | public Sneakers(Finery p) { 13 | super(p); 14 | } 15 | protected Finery component; 16 | @Override 17 | public void show() { 18 | System.out.print("球鞋 "); 19 | super.show(); 20 | } 21 | } 22 | 23 | -------------------------------------------------------------------------------- /src/c06/decorator/TShirts.java: -------------------------------------------------------------------------------- 1 | package c06.decorator; 2 | /** 3 | * 服飾類別 4 | * @author Yan 5 | * 6 | */ 7 | public class TShirts extends Finery { 8 | public TShirts(Finery p) { 9 | super(p); 10 | } 11 | public TShirts() { 12 | } 13 | protected Finery component; 14 | @Override 15 | public void show() { 16 | System.out.print("大T "); 17 | super.show(); 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /src/c06/decorator/Trouser.java: -------------------------------------------------------------------------------- 1 | package c06.decorator; 2 | /** 3 | * 服飾類別 4 | * @author Yan 5 | * 6 | */ 7 | public class Trouser extends Finery { 8 | public Trouser(Finery p) { 9 | super(p); 10 | } 11 | public Trouser() { 12 | } 13 | protected Finery component; 14 | @Override 15 | public void show() { 16 | System.out.print("垮褲 "); 17 | super.show(); 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /src/c07/proxy/IGiveGift.java: -------------------------------------------------------------------------------- 1 | package c07.proxy; 2 | 3 | /** 4 | * 介面,定義各種送禮行為 5 | * 6 | */ 7 | public interface IGiveGift { 8 | public void giveDolls(); 9 | public void giveFlowers(); 10 | public void giveChocolate(); 11 | } 12 | -------------------------------------------------------------------------------- /src/c07/proxy/Proxy.java: -------------------------------------------------------------------------------- 1 | package c07.proxy; 2 | 3 | public class Proxy implements IGiveGift{ 4 | private SchoolGirl mm; //收禮物的女學生 5 | private Pursuit orgPursuit; //被代理的人 6 | private String name; //代理人的姓名 7 | 8 | /** 9 | * 10 | * @param ps 被代理的人 11 | * @param proxyName 代理人的姓名 12 | */ 13 | public Proxy(Pursuit ps, String proxyName){ 14 | this.orgPursuit = ps; 15 | this.name = proxyName; 16 | this.mm = ps.getSchoolGirl(); 17 | } 18 | 19 | @Override 20 | public void giveDolls() { 21 | System.out.println(this.name + " 幫 " + orgPursuit.name + " 送洋娃娃給 " + mm.name); 22 | } 23 | 24 | @Override 25 | public void giveFlowers() { 26 | System.out.println(this.name + " 幫 " + orgPursuit.name + " 送鮮花給 " + mm.name); 27 | } 28 | 29 | @Override 30 | public void giveChocolate() { 31 | System.out.println(this.name + " 幫 " + orgPursuit.name + " 送巧克力給 " + mm.name); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/c07/proxy/Pursuit.java: -------------------------------------------------------------------------------- 1 | package c07.proxy; 2 | 3 | /** 4 | * 5 | * 追求者類別,實做各種送禮物行為 6 | * 7 | */ 8 | public class Pursuit implements IGiveGift{ 9 | private SchoolGirl mm; 10 | public String name; 11 | 12 | 13 | public Pursuit(String name){ 14 | this.name = name; 15 | } 16 | 17 | @Override 18 | public void giveDolls() { 19 | System.out.println(this.name + " 送洋娃娃給 " + mm.name); 20 | } 21 | 22 | @Override 23 | public void giveFlowers() { 24 | System.out.println(this.name + " 送鮮花給 " + mm.name); 25 | } 26 | 27 | @Override 28 | public void giveChocolate() { 29 | System.out.println(this.name + " 送巧克力給 " + mm.name); 30 | } 31 | 32 | // 要送禮物給哪個女學生 33 | public void setSchoolGirl(SchoolGirl mm){ 34 | this.mm = mm; 35 | } 36 | 37 | public SchoolGirl getSchoolGirl(){ 38 | return this.mm; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/c07/proxy/SchoolGirl.java: -------------------------------------------------------------------------------- 1 | package c07.proxy; 2 | 3 | /** 4 | * 接受禮物的女學生 5 | */ 6 | public class SchoolGirl { 7 | public String name; 8 | } 9 | -------------------------------------------------------------------------------- /src/c08/factory/IFactory.java: -------------------------------------------------------------------------------- 1 | package c08.factory; 2 | 3 | /** 4 | * 南丁格爾工廠 5 | * @author Yan 6 | * 7 | */ 8 | public interface IFactory { 9 | public Nightingale CreateNightingale(); 10 | } 11 | -------------------------------------------------------------------------------- /src/c08/factory/Nightingale.java: -------------------------------------------------------------------------------- 1 | package c08.factory; 2 | 3 | /** 4 | * 5 | * 南丁格爾類別,有各種幫助老人起居生活的方法 6 | * 7 | */ 8 | public class Nightingale { 9 | public void sweep(){ 10 | System.out.println("掃地"); 11 | } 12 | public void wash(){ 13 | System.out.println("洗衣"); 14 | } 15 | public void buyRice(){ 16 | System.out.println("買米"); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/c08/factory/SimpleFactory.java: -------------------------------------------------------------------------------- 1 | package c08.factory; 2 | 3 | /** 4 | * 南丁格爾服務團simple factory 5 | * @author Yan 6 | * 7 | */ 8 | public class SimpleFactory { 9 | public static Nightingale CreatNightingale(String type) { 10 | Nightingale nt = null; 11 | switch(type){ 12 | case "undergraduate": 13 | System.out.println("熱心大學生行前教育中..."); 14 | nt = new Undergraduate(); 15 | System.out.println("熱心大學生出發服務老人"); 16 | break; 17 | case "volunteer": 18 | System.out.println("社區義工訓練中..."); 19 | nt = new Volunteer(); 20 | System.out.println("社區義工待命中"); 21 | break; 22 | } 23 | 24 | return nt; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/c08/factory/Undergraduate.java: -------------------------------------------------------------------------------- 1 | package c08.factory; 2 | 3 | /** 4 | * 5 | * 希望以南丁格爾精神服務社區老人的熱心大學生類別 6 | * 7 | */ 8 | public class Undergraduate extends Nightingale{ 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/c08/factory/UndergraduateFactory.java: -------------------------------------------------------------------------------- 1 | package c08.factory; 2 | 3 | /** 4 | * 產生熱心大學生的社團(工廠) 5 | * @author Yan 6 | * 7 | */ 8 | public class UndergraduateFactory implements IFactory { 9 | 10 | @Override 11 | public Nightingale CreateNightingale() { 12 | System.out.println("義工社熱心大學生行前教育..."); 13 | System.out.println("行前教育完成"); 14 | return new Undergraduate(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/c08/factory/Volunteer.java: -------------------------------------------------------------------------------- 1 | package c08.factory; 2 | 3 | /** 4 | * 5 | * 希望以南丁格爾精神服務社區老人的社區義工 6 | * 7 | */ 8 | public class Volunteer extends Nightingale{ 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/c08/factory/VolunteerFactory.java: -------------------------------------------------------------------------------- 1 | package c08.factory; 2 | 3 | /** 4 | * 產生社區義工的義工班(工廠) 5 | * @author Yan 6 | * 7 | */ 8 | public class VolunteerFactory implements IFactory { 9 | 10 | @Override 11 | public Nightingale CreateNightingale() { 12 | System.out.println("社區義工教育訓練..."); 13 | System.out.println("教育訓練完成"); 14 | return new Volunteer(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/c09/prototype/Resume.java: -------------------------------------------------------------------------------- 1 | package c09.prototype; 2 | 3 | /** 4 | * 履歷 5 | * @author Yan 6 | * 7 | */ 8 | public class Resume implements Cloneable{ 9 | private String name; 10 | private String age; 11 | private String education; 12 | private WorkExperience work; 13 | 14 | 15 | public Resume(String name){ 16 | this.name = name; 17 | work = new WorkExperience(); 18 | } 19 | 20 | private Resume(WorkExperience work) throws CloneNotSupportedException{ 21 | this.work = (WorkExperience) work.clone(); 22 | } 23 | 24 | public void setProfile(String age, String education){ 25 | this.age = age; 26 | this.education = education; 27 | } 28 | 29 | public void setWorkExperience(String workDate, String company){ 30 | work.setWorkDate(workDate); 31 | work.setCompany(company); 32 | } 33 | 34 | @Override 35 | public Object clone() throws CloneNotSupportedException { 36 | // 直接使用 super.clone(),不會得到新的 WorkExperinece實體 37 | Resume clone = new Resume(this.work); 38 | clone.name = this.name; 39 | clone.age = this.age; 40 | clone.education = this.education; 41 | return clone; 42 | } 43 | 44 | 45 | public void display(){ 46 | System.out.printf("%s %s %s \n", name,education,age); 47 | System.out.printf("工作經歷: %s %s \n", work.getWorkDate(), work.getCompany()); 48 | } 49 | } 50 | 51 | 52 | /** 53 | * 履歷中的工作經驗 54 | * @author Yan 55 | * 56 | */ 57 | class WorkExperience implements Cloneable { 58 | private String workDate; 59 | private String company; 60 | public String getCompany() { 61 | return company; 62 | } 63 | public void setCompany(String company) { 64 | this.company = company; 65 | } 66 | public String getWorkDate() { 67 | return workDate; 68 | } 69 | public void setWorkDate(String workDate) { 70 | this.workDate = workDate; 71 | } 72 | 73 | @Override 74 | protected Object clone() throws CloneNotSupportedException { 75 | return super.clone(); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/c10/template/TestPaper.java: -------------------------------------------------------------------------------- 1 | package c10.template; 2 | 3 | /** 4 | * 考試卷,共用的題目先寫好做為template,其他會變動的部分交由子類別實作 5 | * @author Yan 6 | * 7 | */ 8 | public abstract class TestPaper { 9 | /** 10 | * 列印整張考卷的題目與做答結果 11 | * @param question 12 | * @param answer 13 | */ 14 | public void display(){ 15 | System.out.println(answerA() + " " + QuestionA()); 16 | System.out.println(answerB() + " " + QuestionB()); 17 | System.out.println(answerC() + " " + QuestionC()); 18 | }; 19 | 20 | /** 21 | * @return 這張考卷題目1 作答的答案 22 | */ 23 | protected abstract String answerA(); 24 | /** 25 | * @return 這張考卷題目2 作答的答案 26 | */ 27 | protected abstract String answerB(); 28 | /** 29 | * @return 這張考卷題目3作答的答案 30 | */ 31 | protected abstract String answerC(); 32 | 33 | private String QuestionA(){ 34 | return "1.楊過的玄鐵劍材質可能是[]? a.球磨鑄鐵 b.馬蹄鐵 c.高速合金鋼 d.碳纖維"; 35 | } 36 | private String QuestionB(){ 37 | return "2.情花谷的情花被剷光了會造成[]? a.使這種植物不會再害人 b.使一種稀有植物滅絕 c.破壞當地生態圈 d.造成當地沙漠化"; 38 | } 39 | private String QuestionC(){ 40 | return "3.藍鳳凰下讀使人嘔吐不止,應該用什麼藥物治療[]? a.阿斯匹靈 b.牛黃解毒片 c.大量生牛奶 d.以上皆錯"; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/c10/template/TestPaperA.java: -------------------------------------------------------------------------------- 1 | package c10.template; 2 | 3 | public class TestPaperA extends TestPaper{ 4 | 5 | @Override 6 | protected String answerA() { 7 | return "b"; 8 | } 9 | 10 | @Override 11 | protected String answerB() { 12 | return "d"; 13 | } 14 | 15 | @Override 16 | protected String answerC() { 17 | return "c"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/c10/template/TestPaperB.java: -------------------------------------------------------------------------------- 1 | package c10.template; 2 | 3 | public class TestPaperB extends TestPaper{ 4 | 5 | @Override 6 | protected String answerA() { 7 | return "c"; 8 | } 9 | 10 | @Override 11 | protected String answerB() { 12 | return "a"; 13 | } 14 | 15 | @Override 16 | protected String answerC() { 17 | return "a"; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/c12/facade/Fund.java: -------------------------------------------------------------------------------- 1 | package c12.facade; 2 | 3 | /** 4 | * 幫你操作股票的基金類別 5 | * @author Yan 6 | * 7 | */ 8 | public class Fund { 9 | Stock stock; 10 | Realty realty; 11 | Nationaldept dept; 12 | 13 | public Fund(){ 14 | stock = new Stock(); 15 | realty = new Realty(); 16 | dept = new Nationaldept(); 17 | } 18 | 19 | /** 20 | * 基金操做投資組合 21 | */ 22 | public void buyFund(){ 23 | stock.buy(); 24 | realty.buy(); 25 | dept.buy(); 26 | }; 27 | 28 | /** 29 | * 基金操做投資組合 30 | */ 31 | public void sellFund(){ 32 | stock.sell(); 33 | realty.sell(); 34 | dept.sell(); 35 | }; 36 | } 37 | 38 | /** 39 | * 股票類 40 | * @author Yan 41 | * 42 | */ 43 | class Stock { 44 | 45 | public void buy(){ 46 | System.out.println("買入股票"); 47 | } 48 | 49 | public void sell(){ 50 | System.out.println("賣出股票"); 51 | } 52 | 53 | } 54 | 55 | /** 56 | * 國債類 57 | * @author Yan 58 | * 59 | */ 60 | class Nationaldept { 61 | 62 | public void buy(){ 63 | System.out.println("買入國債"); 64 | } 65 | 66 | public void sell(){ 67 | System.out.println("賣出國債"); 68 | } 69 | 70 | } 71 | 72 | /** 73 | * 不動產類 74 | * @author Yan 75 | * 76 | */ 77 | class Realty { 78 | 79 | public void buy(){ 80 | System.out.println("買入不動產"); 81 | } 82 | 83 | public void sell(){ 84 | System.out.println("賣出不動產"); 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /src/c13/builder/GundamBuilder.java: -------------------------------------------------------------------------------- 1 | package c13.builder; 2 | 3 | public class GundamBuilder extends PersonBuilder{ 4 | 5 | 6 | @Override 7 | public void buildHead() { 8 | System.out.println("畫一個長橢圓做為頭"); 9 | System.out.println("頭上兩條天線"); 10 | System.out.println("畫眼睛,鼻子,嘴巴"); 11 | } 12 | 13 | @Override 14 | public void buildBody() { 15 | System.out.println("畫一個長方型做為身體"); 16 | System.out.println("畫鋼彈身體細部"); 17 | System.out.println("畫身體後面的翅膀"); 18 | } 19 | 20 | @Override 21 | public void buildLeftArm() { 22 | System.out.println("畫左手"); 23 | System.out.println("..........裝配左手武器"); 24 | } 25 | 26 | @Override 27 | public void buildRightArm() { 28 | System.out.println("畫右手"); 29 | System.out.println("..........裝配右手武器"); 30 | } 31 | 32 | @Override 33 | public void buildLeftLeg() { 34 | System.out.println("畫左腳,加上不會軟的膝蓋"); 35 | } 36 | 37 | @Override 38 | public void buildRightLeg() { 39 | System.out.println("畫左腳,加上不會軟的膝蓋"); 40 | } 41 | 42 | @Override 43 | public void buildFinish() { 44 | System.out.println("鋼彈X建造完成"); 45 | } 46 | 47 | } 48 | -------------------------------------------------------------------------------- /src/c13/builder/LinePersonBuilder.java: -------------------------------------------------------------------------------- 1 | package c13.builder; 2 | 3 | public class LinePersonBuilder extends PersonBuilder{ 4 | 5 | 6 | @Override 7 | public void buildHead() { 8 | System.out.println("畫一個圓做為頭"); 9 | } 10 | 11 | @Override 12 | public void buildBody() { 13 | System.out.println("畫一個正方型做為身體"); 14 | } 15 | 16 | @Override 17 | public void buildLeftArm() { 18 | System.out.println("一條線表示左手"); 19 | } 20 | 21 | @Override 22 | public void buildRightArm() { 23 | System.out.println("一條線表示右手"); 24 | } 25 | 26 | @Override 27 | public void buildLeftLeg() { 28 | System.out.println("一條線表示左腳"); 29 | } 30 | 31 | @Override 32 | public void buildRightLeg() { 33 | System.out.println("一條線表示右腳"); 34 | } 35 | 36 | @Override 37 | public void buildFinish() { 38 | System.out.println("線條人建造完成"); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /src/c13/builder/PersonBuilder.java: -------------------------------------------------------------------------------- 1 | package c13.builder; 2 | 3 | /** 4 | * 小人建造器抽像類別,訂出要建造一個小人所需要的方法 5 | * @author Yan 6 | * 7 | */ 8 | public abstract class PersonBuilder { 9 | 10 | /** 11 | * 畫一個小人的頭 12 | */ 13 | public abstract void buildHead(); 14 | /** 15 | * 畫一個小人的身體 16 | */ 17 | public abstract void buildBody(); 18 | /** 19 | * 畫一個小人的左手 20 | */ 21 | public abstract void buildLeftArm(); 22 | /** 23 | * 畫一個小人的右手 24 | */ 25 | public abstract void buildRightArm(); 26 | /** 27 | * 畫一個小人的左腳 28 | */ 29 | public abstract void buildLeftLeg(); 30 | /** 31 | * 畫一個小人的右腳 32 | */ 33 | public abstract void buildRightLeg(); 34 | 35 | /** 36 | * 宣告建造完成 37 | */ 38 | public abstract void buildFinish(); 39 | } 40 | 41 | -------------------------------------------------------------------------------- /src/c13/builder/PersonDirector.java: -------------------------------------------------------------------------------- 1 | package c13.builder; 2 | 3 | /** 4 | * 指揮如何建造小人的類別 5 | * @author Yan 6 | * 7 | */ 8 | public class PersonDirector { 9 | private PersonBuilder pb; 10 | public void setPersonBuilder(PersonBuilder pb){ 11 | this.pb = pb; 12 | } 13 | 14 | public void createPersonFromHead(){ 15 | System.out.println("從頭往下畫"); 16 | pb.buildHead(); 17 | pb.buildBody(); 18 | pb.buildLeftArm(); 19 | pb.buildRightArm(); 20 | pb.buildLeftLeg(); 21 | pb.buildRightLeg(); 22 | } 23 | 24 | public void createPersonFromLeg(){ 25 | System.out.println("從腳開始往上畫"); 26 | pb.buildLeftLeg(); 27 | pb.buildRightLeg(); 28 | 29 | pb.buildLeftArm(); 30 | pb.buildRightArm(); 31 | 32 | pb.buildBody(); 33 | pb.buildHead(); 34 | 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/c14/observer/Boss.java: -------------------------------------------------------------------------------- 1 | package c14.observer; 2 | /** 3 | * 老闆也可以是一個通知者,只是被老闆通知上班別偷懶會很慘 4 | * @author Yan 5 | * 6 | */ 7 | public class Boss extends Subject { 8 | 9 | @Override 10 | public void notifyObserver(String states) { 11 | for(Observer ob : list){ 12 | ob.update(states); 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/c14/observer/NBAObserver.java: -------------------------------------------------------------------------------- 1 | package c14.observer; 2 | 3 | /** 4 | * 上班看NBA的同事 5 | * @author Yan 6 | * 7 | */ 8 | public class NBAObserver extends Observer{ 9 | 10 | public NBAObserver(String name, Subject sub) { 11 | super(name, sub); 12 | } 13 | 14 | @Override 15 | public void update(String states) { 16 | System.out.println(states + "->" + name + " 把NBA關了!!"); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c14/observer/Observer.java: -------------------------------------------------------------------------------- 1 | package c14.observer; 2 | /** 3 | * 定義各種不認真上班的同事,除了不物正業外,最重要的就是觀察通知者給的訊息,因此叫observer 4 | * @author Yan 5 | * 6 | */ 7 | public abstract class Observer { 8 | protected String name; 9 | protected Subject sub; 10 | public Observer(String name,Subject sub){ 11 | this.name = name; 12 | this.sub = sub; 13 | } 14 | 15 | public abstract void update(String status); 16 | } 17 | -------------------------------------------------------------------------------- /src/c14/observer/Secretary.java: -------------------------------------------------------------------------------- 1 | package c14.observer; 2 | /** 3 | * 櫃台秘書小妹,在門口看到老闆回來負責通知不務正業的同事 4 | * @author Yan 5 | * 6 | */ 7 | public class Secretary extends Subject{ 8 | 9 | @Override 10 | public void notifyObserver(String states) { 11 | for(Observer ob:list){ 12 | ob.update(states);; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/c14/observer/StockObserver.java: -------------------------------------------------------------------------------- 1 | package c14.observer; 2 | 3 | /** 4 | * 上班玩股票的同事 5 | * @author Yan 6 | * 7 | */ 8 | public class StockObserver extends Observer{ 9 | 10 | public StockObserver(String name, Subject sub) { 11 | super(name, sub); 12 | } 13 | 14 | @Override 15 | public void update(String states) { 16 | System.out.println(states + "->" + name + " 別再看股票行情了!!"); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c14/observer/Subject.java: -------------------------------------------------------------------------------- 1 | package c14.observer; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 通知者介面,負責通知那些不物正業的員工,老闆回來了 8 | * @author Yan 9 | * 10 | */ 11 | public abstract class Subject { 12 | protected List list = new ArrayList<>(); 13 | 14 | public void attach(Observer observer){ 15 | list.add(observer); 16 | }; 17 | public void detach(Observer observer){ 18 | list.remove(observer); 19 | } 20 | 21 | public abstract void notifyObserver(String states); 22 | } 23 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/Department.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | 3 | /** 4 | * table 定義的user類別 5 | * @author Yan 6 | * 7 | */ 8 | public class Department { 9 | private int id; 10 | private String deptName; 11 | 12 | public Department(int id, String deptName){ 13 | this.id = id; 14 | this.deptName = deptName; 15 | } 16 | 17 | public int getId() { 18 | return id; 19 | } 20 | public void setId(int id) { 21 | this.id = id; 22 | } 23 | public String getDeptName() { 24 | return deptName; 25 | } 26 | public void setDeptName(String deptName) { 27 | this.deptName = deptName; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/IDeptDao.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | 3 | /** 4 | * 定義建造UserDao的工廠介面 5 | * @author Yan 6 | * 7 | */ 8 | public interface IDeptDao { 9 | /** 10 | * 插入一筆dept到資料庫 11 | * @param dept 12 | */ 13 | void insert(Department dept); 14 | /** 15 | * 使用id取出一筆dept資料 16 | * @param id 17 | * @return 18 | */ 19 | Department getDept(int id); 20 | } 21 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/IFactory.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | 3 | /** 4 | * 定義存取table方法的UserDao介面 5 | * @author Yan 6 | * 7 | */ 8 | public interface IFactory { 9 | /** 10 | * 取得存取資料庫user資料的DAO 11 | * @return 12 | */ 13 | IUserDao createUserDao(); 14 | 15 | /** 16 | * 取得存取資料庫dept資料的DAO 17 | * @return 18 | */ 19 | IDeptDao createDeptDao(); 20 | } 21 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/IUserDao.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | 3 | /** 4 | * 定義建造UserDao的工廠介面 5 | * @author Yan 6 | * 7 | */ 8 | public interface IUserDao { 9 | /** 10 | * 插入一筆user到資料庫 11 | * @param user 12 | */ 13 | void insert(User user); 14 | /** 15 | * 使用id取出一筆user資料 16 | * @param id 17 | * @return 18 | */ 19 | User getUser(int id); 20 | } 21 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/OracleDaoFactory.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | /** 3 | * 用來建立存取sql server資料的各種dao 4 | * @author Yan 5 | * 6 | */ 7 | public class OracleDaoFactory implements IFactory{ 8 | 9 | @Override 10 | public IUserDao createUserDao() { 11 | return new OracleUserDao(); 12 | } 13 | 14 | @Override 15 | public IDeptDao createDeptDao() { 16 | return new OracleDeptDao(); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/OracleDeptDao.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | 3 | 4 | /** 5 | * oracle資料庫存取dept資料表的Dao 6 | * @author Yan 7 | * 8 | */ 9 | public class OracleDeptDao implements IDeptDao { 10 | 11 | @Override 12 | public void insert(Department dept) { 13 | System.out.println("在oracle資料庫插入一筆dept"); 14 | } 15 | 16 | @Override 17 | public Department getDept(int id) { 18 | Department user = new Department(id,""); 19 | System.out.println("oracle資料庫取出Id為 " + id + " 的Department"); 20 | return user; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/OracleUserDao.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | 3 | /** 4 | * 存取oracle資料庫user資料的dao 5 | * @author Yan 6 | * 7 | */ 8 | public class OracleUserDao implements IUserDao { 9 | 10 | @Override 11 | public void insert(User user) { 12 | System.out.println("在oracle資料庫插入一筆user"); 13 | } 14 | 15 | @Override 16 | public User getUser(int id) { 17 | User user = new User(id,""); 18 | System.out.println("oracle資料庫取出Id為 " + id + " 的user"); 19 | return user; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/SqlServerDaoFactory.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | /** 3 | * 用來建立存取sql server資料的各種dao 4 | * @author Yan 5 | * 6 | */ 7 | public class SqlServerDaoFactory implements IFactory{ 8 | 9 | @Override 10 | public IUserDao createUserDao() { 11 | return new SqlServerUserDao(); 12 | } 13 | 14 | @Override 15 | public IDeptDao createDeptDao() { 16 | return new SqlServerDeptDao(); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/SqlServerDeptDao.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | 3 | /** 4 | * sql server資料庫存取dept資料表的Dao 5 | * @author Yan 6 | * 7 | */ 8 | public class SqlServerDeptDao implements IDeptDao { 9 | 10 | @Override 11 | public void insert(Department dept) { 12 | System.out.println("在sql server資料庫插入一筆dept"); 13 | } 14 | 15 | @Override 16 | public Department getDept(int id) { 17 | Department dept = new Department(id,""); 18 | System.out.println("sql server資料庫取出Id為 " + id + " 的dept"); 19 | return dept; 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/SqlServerUserDao.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | /** 3 | * 存取sql server資料庫user資料的dao 4 | * @author Yan 5 | * 6 | */ 7 | public class SqlServerUserDao implements IUserDao { 8 | 9 | @Override 10 | public void insert(User user) { 11 | System.out.println("在sql server資料庫插入一筆user"); 12 | } 13 | 14 | @Override 15 | public User getUser(int id) { 16 | User user = new User(id,""); 17 | System.out.println("sql server資料庫取出Id為 " + id + " 的user"); 18 | return user; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /src/c15/abstractFactory/User.java: -------------------------------------------------------------------------------- 1 | package c15.abstractFactory; 2 | 3 | /** 4 | * table 定義的user類別 5 | * @author Yan 6 | * 7 | */ 8 | public class User { 9 | private int id; 10 | private String name; 11 | 12 | public User(int id, String name){ 13 | this.id = id; 14 | this.name = name; 15 | } 16 | 17 | public int getId() { 18 | return id; 19 | } 20 | public void setId(int id) { 21 | this.id = id; 22 | } 23 | public String getName() { 24 | return name; 25 | } 26 | public void setName(String name) { 27 | this.name = name; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/c16/state/AfternoonState.java: -------------------------------------------------------------------------------- 1 | package c16.state; 2 | /** 3 | * 中午吃飯休息狀態 4 | * @author Yan 5 | * 6 | */ 7 | public class AfternoonState implements State { 8 | 9 | @Override 10 | public void writeProgram(Work work) { 11 | if(work.getHour() < 18){ 12 | System.out.println("下午" + work.getHour() + "點,等下班"); 13 | } else { 14 | work.setState(new EveningState()); 15 | work.writeProgram(); 16 | } 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c16/state/EveningState.java: -------------------------------------------------------------------------------- 1 | package c16.state; 2 | /** 3 | * 傍晚狀態 4 | * @author Yan 5 | * 6 | */ 7 | public class EveningState implements State { 8 | 9 | @Override 10 | public void writeProgram(Work work) { 11 | if(work.isFinish()){ 12 | work.setState(new RestState()); 13 | work.writeProgram(); 14 | } else if(work.getHour() < 21){ 15 | System.out.println(work.getHour() + "點,加班中,哭哭"); 16 | } else { 17 | System.out.println(work.getHour() + "點,警位伯伯要關門下班了"); 18 | work.setState(new RestState()); 19 | work.writeProgram(); 20 | } 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /src/c16/state/ForenoonState.java: -------------------------------------------------------------------------------- 1 | package c16.state; 2 | /** 3 | * 早上上班狀態 4 | * @author Yan 5 | * 6 | */ 7 | public class ForenoonState implements State { 8 | 9 | @Override 10 | public void writeProgram(Work work) { 11 | if(work.getHour() < 12){ 12 | System.out.println("早上" + work.getHour() + "點,工作很有精神"); 13 | } else { 14 | work.setState(new NoonState()); 15 | work.writeProgram(); 16 | } 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c16/state/NoonState.java: -------------------------------------------------------------------------------- 1 | package c16.state; 2 | /** 3 | * 中午吃飯休息狀態 4 | * @author Yan 5 | * 6 | */ 7 | public class NoonState implements State { 8 | 9 | @Override 10 | public void writeProgram(Work work) { 11 | if(work.getHour() < 13){ 12 | System.out.println("中午" + work.getHour() + "點,吃飯吃飯"); 13 | } else { 14 | work.setState(new AfternoonState()); 15 | work.writeProgram(); 16 | } 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c16/state/RestState.java: -------------------------------------------------------------------------------- 1 | package c16.state; 2 | /** 3 | * 中午吃飯休息狀態 4 | * @author Yan 5 | * 6 | */ 7 | public class RestState implements State { 8 | 9 | @Override 10 | public void writeProgram(Work work) { 11 | System.out.println(work.getHour()+"點 !!!下班回家休息了"); 12 | } 13 | 14 | } 15 | -------------------------------------------------------------------------------- /src/c16/state/State.java: -------------------------------------------------------------------------------- 1 | package c16.state; 2 | 3 | public interface State { 4 | void writeProgram(Work work); 5 | } 6 | -------------------------------------------------------------------------------- /src/c16/state/Work.java: -------------------------------------------------------------------------------- 1 | package c16.state; 2 | 3 | /** 4 | * 工作 5 | * @author Yan 6 | * 7 | */ 8 | public class Work { 9 | private int hour; //現在時間 10 | private boolean finish = false; //是否完成 11 | private State current; //目前狀態 12 | 13 | public Work(){ 14 | current = new ForenoonState(); 15 | } 16 | 17 | public int getHour() { 18 | return hour; 19 | } 20 | 21 | public void setHour(int hour) { 22 | this.hour = hour; 23 | } 24 | 25 | public boolean isFinish() { 26 | return finish; 27 | } 28 | 29 | public void setFinish(boolean finish) { 30 | this.finish = finish; 31 | } 32 | 33 | public State getState() { 34 | return current; 35 | } 36 | 37 | public void setState(State current) { 38 | this.current = current; 39 | } 40 | 41 | public void writeProgram(){ 42 | current.writeProgram(this); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/c17/adapter/CenterPlayer.java: -------------------------------------------------------------------------------- 1 | package c17.adapter; 2 | 3 | public class CenterPlayer extends Player{ 4 | 5 | public CenterPlayer(String name) { 6 | super(name); 7 | } 8 | 9 | @Override 10 | public void attack() { 11 | System.out.println(name + " gogogo shot"); 12 | } 13 | 14 | @Override 15 | public void defense() { 16 | System.out.println(name + " try stop him"); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c17/adapter/ForeignCenterPlayer.java: -------------------------------------------------------------------------------- 1 | package c17.adapter; 2 | 3 | public class ForeignCenterPlayer { 4 | private String name; 5 | 6 | public ForeignCenterPlayer(String name){ 7 | this.name = name; 8 | } 9 | 10 | public String getName(){ 11 | return name; 12 | } 13 | 14 | /** 15 | * 字尾C表示只能聽懂中文 16 | */ 17 | public void attackC(){ 18 | System.out.println(name + " 上去投藍"); 19 | } 20 | 21 | /** 22 | * 字尾C表示只能聽懂中文 23 | */ 24 | public void defenseC(){ 25 | System.out.println(name + " 把他擋下"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/c17/adapter/Player.java: -------------------------------------------------------------------------------- 1 | package c17.adapter; 2 | 3 | public abstract class Player { 4 | protected String name; 5 | public Player(){ 6 | 7 | } 8 | 9 | public Player(String name){ 10 | this.name = name; 11 | } 12 | 13 | public abstract void attack(); 14 | public abstract void defense(); 15 | } 16 | -------------------------------------------------------------------------------- /src/c17/adapter/Translator.java: -------------------------------------------------------------------------------- 1 | package c17.adapter; 2 | 3 | public class Translator extends Player{ 4 | private ForeignCenterPlayer wjzf; 5 | 6 | public Translator(String name) { 7 | wjzf = new ForeignCenterPlayer(name); 8 | } 9 | 10 | @Override 11 | public void attack() { 12 | System.out.print(wjzf.getName() + " gogogo shot"); 13 | System.out.print("->" ); 14 | wjzf.attackC(); 15 | } 16 | 17 | @Override 18 | public void defense() { 19 | System.out.print(wjzf.getName() + " try stop him"); 20 | System.out.print("->" ); 21 | 22 | wjzf.defenseC(); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/c18/memento/GameRole.java: -------------------------------------------------------------------------------- 1 | package c18.memento; 2 | 3 | public class GameRole { 4 | private int hp = 100; 5 | private int atk = 100; 6 | private int def = 100; 7 | private String name = "第六天魔王"; 8 | 9 | public RoleStateMemo save(){ 10 | return new RoleStateMemo(hp,atk,def); 11 | } 12 | 13 | 14 | /** 15 | * 16 | */ 17 | public void fight(){ 18 | hp = 30; 19 | System.out.println(name + "剩下30%血量,出大招把隊伍打的半死"); 20 | } 21 | 22 | public void stateDisplay(){ 23 | System.out.println(name+"的狀態:"); 24 | System.out.print("hp=" + hp); 25 | System.out.print(", atk=" + atk); 26 | System.out.println(", def=" + def); 27 | System.out.println(); 28 | } 29 | 30 | 31 | 32 | public void load(RoleStateMemo memo){ 33 | this.hp = memo.getHp(); 34 | this.atk = memo.getAtk(); 35 | this.def = memo.getDef(); 36 | } 37 | public int getHp() { 38 | return hp; 39 | } 40 | public void setHp(int hp) { 41 | this.hp = hp; 42 | } 43 | public int getAtk() { 44 | return atk; 45 | } 46 | public void setAtk(int atk) { 47 | this.atk = atk; 48 | } 49 | public int getDef() { 50 | return def; 51 | } 52 | public void setDef(int def) { 53 | this.def = def; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/c18/memento/RoleStateCareTaker.java: -------------------------------------------------------------------------------- 1 | package c18.memento; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class RoleStateCareTaker { 7 | public List saves = new ArrayList<>(); 8 | 9 | public RoleStateMemo getSave(){ 10 | return saves.get(0); 11 | } 12 | 13 | public void setSave(RoleStateMemo memo){ 14 | saves.add(0, memo); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/c18/memento/RoleStateMemo.java: -------------------------------------------------------------------------------- 1 | package c18.memento; 2 | 3 | public class RoleStateMemo { 4 | private int hp; 5 | private int atk; 6 | private int def; 7 | 8 | public RoleStateMemo(int hp, int atk, int def) { 9 | this.hp = hp; 10 | this.atk = atk; 11 | this.def = def; 12 | } 13 | public int getHp() { 14 | return hp; 15 | } 16 | public void setHp(int hp) { 17 | this.hp = hp; 18 | } 19 | public int getAtk() { 20 | return atk; 21 | } 22 | public void setAtk(int atk) { 23 | this.atk = atk; 24 | } 25 | public int getDef() { 26 | return def; 27 | } 28 | public void setDef(int def) { 29 | this.def = def; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/c19/composite/Company.java: -------------------------------------------------------------------------------- 1 | package c19.composite; 2 | /** 3 | * 公司抽象類別 4 | * @author Yan 5 | * 6 | */ 7 | public abstract class Company { 8 | protected String name; 9 | public Company(String name){ 10 | this.name = name; 11 | } 12 | /** 13 | * 增加轄下部門或分公司 14 | * @param c 15 | */ 16 | public abstract void add(Company c); 17 | /** 18 | * 移除轄下部門或分公司 19 | * @param c 20 | */ 21 | public abstract void remove(Company c); 22 | /** 23 | * 印出組織結構圖 24 | * @param depth 25 | */ 26 | public abstract void display(int depth); 27 | 28 | /** 29 | * 印出組織職責 30 | */ 31 | public abstract void lineOfDuty(); 32 | 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/c19/composite/ConcreteCompany.java: -------------------------------------------------------------------------------- 1 | package c19.composite; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class ConcreteCompany extends Company { 7 | private List children = new ArrayList<>(); 8 | 9 | 10 | public ConcreteCompany(String name) { 11 | super(name); 12 | } 13 | 14 | @Override 15 | public void add(Company c) { 16 | children.add(c); 17 | } 18 | 19 | @Override 20 | public void remove(Company c) { 21 | children.remove(c); 22 | } 23 | 24 | @Override 25 | public void display(int depth) { 26 | for(int i = 0 ; i < depth ; i++){ 27 | System.out.print('-'); 28 | } 29 | System.out.println(name); 30 | for(Company c : children){ 31 | c.display(depth+2); 32 | } 33 | } 34 | 35 | @Override 36 | public void lineOfDuty() { 37 | for(Company c : children){ 38 | c.lineOfDuty(); 39 | } 40 | } 41 | 42 | } 43 | -------------------------------------------------------------------------------- /src/c19/composite/FinaneDept.java: -------------------------------------------------------------------------------- 1 | package c19.composite; 2 | 3 | public class FinaneDept extends Company { 4 | public FinaneDept(String name) { 5 | super(name); 6 | } 7 | 8 | @Override 9 | public void add(Company c) { 10 | 11 | } 12 | 13 | @Override 14 | public void remove(Company c) { 15 | 16 | } 17 | 18 | @Override 19 | public void display(int depth) { 20 | for(int i = 0 ; i < depth ; i++){ 21 | System.out.print('-'); 22 | } 23 | System.out.println(name); 24 | } 25 | 26 | @Override 27 | public void lineOfDuty() { 28 | System.out.println(name + " 製造公司很賺錢的假像"); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/c19/composite/HRDept.java: -------------------------------------------------------------------------------- 1 | package c19.composite; 2 | 3 | public class HRDept extends Company { 4 | public HRDept(String name) { 5 | super(name); 6 | } 7 | 8 | @Override 9 | public void add(Company c) { 10 | 11 | } 12 | 13 | @Override 14 | public void remove(Company c) { 15 | 16 | } 17 | 18 | @Override 19 | public void display(int depth) { 20 | for(int i = 0 ; i < depth ; i++){ 21 | System.out.print('-'); 22 | } 23 | System.out.println(name); 24 | } 25 | 26 | @Override 27 | public void lineOfDuty() { 28 | System.out.println(name + " 招騙新鮮的肝"); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/c20/iterator/Aggregate.java: -------------------------------------------------------------------------------- 1 | package c20.iterator; 2 | 3 | /** 4 | * 集合元素抽象介面 5 | * @author Yan 6 | * @param 7 | */ 8 | public interface Aggregate { 9 | Iterator createIterator(); 10 | void add(T t); 11 | int size(); 12 | T get(int index); 13 | } 14 | -------------------------------------------------------------------------------- /src/c20/iterator/ConcreteAggregate.java: -------------------------------------------------------------------------------- 1 | package c20.iterator; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class ConcreteAggregate implements Aggregate { 7 | private List items = new ArrayList<>(); 8 | 9 | @Override 10 | public Iterator createIterator() { 11 | return new ConcreteIterator<>(this); 12 | } 13 | @Override 14 | public int size(){ 15 | return items.size(); 16 | } 17 | @Override 18 | public T get(int index){ 19 | return items.get(index); 20 | } 21 | @Override 22 | public void add(T t){ 23 | items.add(t); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/c20/iterator/ConcreteIterator.java: -------------------------------------------------------------------------------- 1 | package c20.iterator; 2 | 3 | public class ConcreteIterator implements Iterator { 4 | private Aggregate aggregate; 5 | private int current = 0; 6 | 7 | /** 8 | * 初始化時傳入aggregate物件 9 | * @param aggregate 10 | */ 11 | public ConcreteIterator(Aggregate aggregate){ 12 | this.aggregate = aggregate; 13 | } 14 | 15 | @Override 16 | public T first() { 17 | return aggregate.get(0); 18 | } 19 | 20 | @Override 21 | public T next() { 22 | current++; 23 | return current < aggregate.size() ? aggregate.get(current) : null; 24 | } 25 | 26 | @Override 27 | public boolean isDone() { 28 | return current < aggregate.size(); 29 | } 30 | 31 | @Override 32 | public T currentItem() { 33 | return current < aggregate.size() ? aggregate.get(current) : null; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /src/c20/iterator/Iterator.java: -------------------------------------------------------------------------------- 1 | package c20.iterator; 2 | 3 | /** 4 | * 迭代器介面 5 | * @author Yan 6 | * @param 7 | */ 8 | public interface Iterator { 9 | /** 10 | * 取出第一個元素 11 | * @return 12 | */ 13 | T first(); 14 | /** 15 | * 取出下一個元素 16 | * @return 17 | */ 18 | T next(); 19 | /** 20 | * 判斷是否結束 21 | * @return 22 | */ 23 | boolean isDone(); 24 | 25 | /** 26 | * 取當前元素 27 | * @return 28 | */ 29 | T currentItem(); 30 | 31 | } 32 | -------------------------------------------------------------------------------- /src/c21/singleton/Singleton.java: -------------------------------------------------------------------------------- 1 | package c21.singleton; 2 | 3 | public class Singleton { 4 | private static Singleton instance; 5 | 6 | private Singleton(){ 7 | 8 | } 9 | 10 | public static Singleton getInstance(){ 11 | if(instance == null){ 12 | instance = new Singleton(); 13 | } 14 | 15 | return instance; 16 | 17 | }; 18 | } 19 | -------------------------------------------------------------------------------- /src/c22/bridge/HandsetBrand.java: -------------------------------------------------------------------------------- 1 | package c22.bridge; 2 | 3 | public abstract class HandsetBrand { 4 | protected HandsetSoft soft; 5 | 6 | public void setHandsetSoft(HandsetSoft soft){ 7 | this.soft = soft; 8 | } 9 | 10 | public abstract void run(); 11 | } 12 | -------------------------------------------------------------------------------- /src/c22/bridge/HandsetBrandM.java: -------------------------------------------------------------------------------- 1 | package c22.bridge; 2 | 3 | public class HandsetBrandM extends HandsetBrand { 4 | private String brand = "M牌手機"; 5 | @Override 6 | public void run() { 7 | System.out.print(brand+" "); 8 | soft.run(); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/c22/bridge/HandsetBrandN.java: -------------------------------------------------------------------------------- 1 | package c22.bridge; 2 | 3 | public class HandsetBrandN extends HandsetBrand { 4 | private String brand = "N牌手機"; 5 | @Override 6 | public void run() { 7 | System.out.print(brand+" "); 8 | soft.run(); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /src/c22/bridge/HandsetContactList.java: -------------------------------------------------------------------------------- 1 | package c22.bridge; 2 | 3 | /** 4 | * 手機通訊錄 5 | * @author Yan 6 | * 7 | */ 8 | public class HandsetContactList implements HandsetSoft { 9 | 10 | @Override 11 | public void run() { 12 | System.out.println("執行手機通訊錄"); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/c22/bridge/HandsetGame.java: -------------------------------------------------------------------------------- 1 | package c22.bridge; 2 | 3 | /** 4 | * 手機遊戲 5 | * @author Yan 6 | * 7 | */ 8 | public class HandsetGame implements HandsetSoft { 9 | 10 | @Override 11 | public void run() { 12 | System.out.println("執行手機遊戲"); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /src/c22/bridge/HandsetSoft.java: -------------------------------------------------------------------------------- 1 | package c22.bridge; 2 | /** 3 | * 手機軟體介面 4 | * @author Yan 5 | * 6 | */ 7 | public interface HandsetSoft { 8 | /** 9 | * 執行軟體 10 | */ 11 | void run(); 12 | } 13 | -------------------------------------------------------------------------------- /src/c23/command/BakeChickenWingCommand.java: -------------------------------------------------------------------------------- 1 | package c23.command; 2 | /** 3 | * 烤雞翅命令 4 | * @author Yan 5 | * 6 | */ 7 | public class BakeChickenWingCommand extends Command { 8 | private String name = "chickhenWing"; 9 | public BakeChickenWingCommand(Barbecuer receiver) { 10 | super(receiver); 11 | } 12 | 13 | @Override 14 | public void excuteCommand() { 15 | receiver.bakeChickenWing(); 16 | } 17 | 18 | public String getName(){ 19 | return name; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/c23/command/BakeMutonCommand.java: -------------------------------------------------------------------------------- 1 | package c23.command; 2 | /** 3 | * 烤羊肉串命令 4 | * @author Yan 5 | * 6 | */ 7 | public class BakeMutonCommand extends Command { 8 | private String name = "mutton"; 9 | public BakeMutonCommand(Barbecuer receiver) { 10 | super(receiver); 11 | } 12 | 13 | @Override 14 | public void excuteCommand() { 15 | receiver.bakeMutton(); 16 | } 17 | public String getName(){ 18 | return name; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/c23/command/Barbecuer.java: -------------------------------------------------------------------------------- 1 | package c23.command; 2 | /** 3 | * 烤肉串廚師 4 | * @author Yan 5 | * 6 | */ 7 | public class Barbecuer { 8 | /** 9 | * 烤羊肉 10 | */ 11 | public void bakeMutton(){ 12 | System.out.println("烤羊肉串"); 13 | } 14 | 15 | /** 16 | * 烤雞翅 17 | */ 18 | public void bakeChickenWing(){ 19 | System.out.println("烤雞翅"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/c23/command/Command.java: -------------------------------------------------------------------------------- 1 | package c23.command; 2 | /** 3 | * 抽象命令 4 | * @author Yan 5 | * 6 | */ 7 | public abstract class Command { 8 | // 接受指令的人 9 | protected Barbecuer receiver; 10 | public Command(Barbecuer receiver){ 11 | this.receiver = receiver; 12 | } 13 | 14 | // 執行指令 15 | abstract public void excuteCommand(); 16 | 17 | abstract public String getName(); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c23/command/Waiter.java: -------------------------------------------------------------------------------- 1 | package c23.command; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Date; 5 | import java.util.List; 6 | /** 7 | * 接訂單的服務生 8 | * @author Yan 9 | * 10 | */ 11 | public class Waiter { 12 | private int chickhenWingCount = 2; 13 | private int muttonCount = 3; 14 | private List orders = new ArrayList<>(); 15 | 16 | /** 17 | * 接訂單 18 | * @param command 19 | */ 20 | @SuppressWarnings("deprecation") 21 | public void setOrder(Command command){ 22 | if(command.getName().equals("chickhenWing")){ 23 | if(chickhenWingCount <= 0){ 24 | System.out.println("雞翅賣完了"); 25 | } else{ 26 | System.out.println("增加"+ command.getName() +"訂單 時間:" + new Date().toLocaleString()); 27 | chickhenWingCount--; 28 | orders.add(command); 29 | } 30 | } else { 31 | if(muttonCount <= 0){ 32 | System.out.println("羊肉串賣完了"); 33 | } else{ 34 | System.out.println("增加"+ command.getName() +"訂單 時間:" + new Date().toLocaleString()); 35 | muttonCount--; 36 | orders.add(command); 37 | 38 | } 39 | } 40 | } 41 | 42 | @SuppressWarnings("deprecation") 43 | /** 44 | * 取消訂單 45 | * @param command 46 | */ 47 | public void cancelOrder(Command command){ 48 | if(command.getName().equals("chickhenWing")){ 49 | chickhenWingCount++; 50 | } else { 51 | muttonCount++; 52 | } 53 | orders.remove(command); 54 | System.out.println("取消"+ command.getName() +"訂單 時間:" + new Date().toLocaleString()); 55 | } 56 | 57 | /** 58 | * 將訂單將給廚師 59 | */ 60 | public void notifyBaker(){ 61 | for(Command c:orders){ 62 | c.excuteCommand(); 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/c24/ChainOfResponsibility/ApplyRequest.java: -------------------------------------------------------------------------------- 1 | package c24.ChainOfResponsibility; 2 | /** 3 | * 提出申請 4 | * @author Yan 5 | * 6 | */ 7 | public class ApplyRequest { 8 | /** 9 | * 申請類別 10 | */ 11 | private String requestType; 12 | /** 13 | * 申請內容 14 | */ 15 | private String requestContent; 16 | /** 17 | * 申請數 18 | */ 19 | private int requestCount; 20 | 21 | 22 | 23 | public String getRequestType() { 24 | return requestType; 25 | } 26 | public void setRequestType(String requestType) { 27 | this.requestType = requestType; 28 | } 29 | public String getRequestContent() { 30 | return requestContent; 31 | } 32 | public void setRequestContent(String requestContent) { 33 | this.requestContent = requestContent; 34 | } 35 | public int getRequestCount() { 36 | return requestCount; 37 | } 38 | public void setRequestCount(int requestCount) { 39 | this.requestCount = requestCount; 40 | } 41 | 42 | 43 | 44 | } 45 | -------------------------------------------------------------------------------- /src/c24/ChainOfResponsibility/CommonManager.java: -------------------------------------------------------------------------------- 1 | package c24.ChainOfResponsibility; 2 | 3 | /** 4 | * 經理 5 | * @author Yan 6 | * 7 | */ 8 | public class CommonManager extends Manager { 9 | 10 | public CommonManager(String name) { 11 | super(name); 12 | } 13 | 14 | @Override 15 | public void apply(ApplyRequest request) { 16 | //2天以下的假就批准,其他丟給上級 17 | if(request.getRequestType().equals("請假") && request.getRequestCount() <= 2){ 18 | System.out.print(request.getRequestType() + ":" + request.getRequestContent()); 19 | System.out.println(" " + request.getRequestCount() + "天 被" + name + "批准"); 20 | } else { 21 | if(superior != null){ 22 | superior.apply(request); 23 | } 24 | } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/c24/ChainOfResponsibility/GeneralManager.java: -------------------------------------------------------------------------------- 1 | package c24.ChainOfResponsibility; 2 | 3 | /** 4 | * 總經理 5 | * @author Yan 6 | * 7 | */ 8 | public class GeneralManager extends Manager { 9 | 10 | public GeneralManager(String name) { 11 | super(name); 12 | } 13 | 14 | @Override 15 | public void apply(ApplyRequest request) { 16 | if(request.getRequestType().equals("請假")){ 17 | System.out.print(request.getRequestType() + ":" + request.getRequestContent()); 18 | System.out.println(" " + request.getRequestCount() + "天 被" + name + "批准"); 19 | } else { 20 | if(request.getRequestCount() <= 1000){ 21 | System.out.print(request.getRequestType() + ":" + request.getRequestContent()); 22 | System.out.println(" " + request.getRequestCount() + "元 被" + name + "批准"); 23 | } else { 24 | System.out.print(request.getRequestType() + ":" + request.getRequestContent()); 25 | System.out.println(" " + request.getRequestCount() + "元 被" + name + "駁回"); 26 | } 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/c24/ChainOfResponsibility/Majordomo.java: -------------------------------------------------------------------------------- 1 | package c24.ChainOfResponsibility; 2 | 3 | /** 4 | * 總監 5 | * @author Yan 6 | * 7 | */ 8 | public class Majordomo extends Manager { 9 | 10 | public Majordomo(String name) { 11 | super(name); 12 | } 13 | 14 | @Override 15 | public void apply(ApplyRequest request) { 16 | //5天以下的假就批准,其他丟給上級 17 | if(request.getRequestType().equals("請假") && request.getRequestCount() <= 5){ 18 | System.out.print(request.getRequestType() + ":" + request.getRequestContent()); 19 | System.out.println(" " + request.getRequestCount() + "天 被" + name + "批准"); 20 | } else { 21 | if(superior != null){ 22 | superior.apply(request); 23 | } 24 | } 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /src/c24/ChainOfResponsibility/Manager.java: -------------------------------------------------------------------------------- 1 | package c24.ChainOfResponsibility; 2 | 3 | /** 4 | * 管理者 5 | * @author Yan 6 | * 7 | */ 8 | public abstract class Manager { 9 | protected String name; 10 | 11 | //上一級管理者 12 | protected Manager superior; 13 | 14 | public Manager(String name){ 15 | this.name = name; 16 | } 17 | 18 | //設定上一級的管理者 19 | public void setSuperior(Manager superior){ 20 | this.superior = superior; 21 | } 22 | /** 23 | * 提出申請 24 | * @param request 25 | */ 26 | abstract public void apply(ApplyRequest request); 27 | } 28 | -------------------------------------------------------------------------------- /src/c25/mediator/Country.java: -------------------------------------------------------------------------------- 1 | package c25.mediator; 2 | /** 3 | * 國家 4 | * @author Yan 5 | * 6 | */ 7 | public abstract class Country { 8 | protected UniteNations mediator; 9 | public Country(UniteNations mediator){ 10 | this.mediator = mediator; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/c25/mediator/Iraq.java: -------------------------------------------------------------------------------- 1 | package c25.mediator; 2 | 3 | public class Iraq extends Country { 4 | 5 | public Iraq(UniteNations mediator) { 6 | super(mediator); 7 | } 8 | /** 9 | * 放話 10 | * @param message 11 | */ 12 | public void declare(String message){ 13 | mediator.declare(message, this); 14 | } 15 | /** 16 | * 接收消息 17 | */ 18 | public void getMessage(String message){ 19 | System.out.println("伊拉克獲得對方訊息: " + message); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/c25/mediator/UNSC.java: -------------------------------------------------------------------------------- 1 | package c25.mediator; 2 | /** 3 | * 聯合國安理會 4 | * @author Yan 5 | * 6 | */ 7 | public class UNSC implements UniteNations { 8 | private USA countryA; 9 | private Iraq countryB; 10 | @Override 11 | public void declare(String message, Country country) { 12 | if(country == countryA){ 13 | countryB.getMessage(message); 14 | } else { 15 | countryA.getMessage(message); 16 | } 17 | 18 | } 19 | 20 | 21 | public USA getCountryA() { 22 | return countryA; 23 | } 24 | public void setCountryA(USA countryA) { 25 | this.countryA = countryA; 26 | } 27 | public Iraq getCountryB() { 28 | return countryB; 29 | } 30 | public void setCountryB(Iraq countryB) { 31 | this.countryB = countryB; 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /src/c25/mediator/USA.java: -------------------------------------------------------------------------------- 1 | package c25.mediator; 2 | 3 | public class USA extends Country { 4 | 5 | public USA(UniteNations mediator) { 6 | super(mediator); 7 | } 8 | /** 9 | * 放話 10 | * @param message 11 | */ 12 | public void declare(String message){ 13 | mediator.declare(message, this); 14 | } 15 | /** 16 | * 接收消息 17 | */ 18 | public void getMessage(String message){ 19 | System.out.println("美國獲得對方訊息: " + message); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /src/c25/mediator/UniteNations.java: -------------------------------------------------------------------------------- 1 | package c25.mediator; 2 | /** 3 | * 聯合國 4 | * @author Yan 5 | * 6 | */ 7 | public interface UniteNations { 8 | /** 9 | * 聯合國幫忙傳話 10 | * @param message 11 | * @param country 12 | */ 13 | void declare(String message,Country country); 14 | } 15 | -------------------------------------------------------------------------------- /src/c26/flywight/ConcreteWebsite.java: -------------------------------------------------------------------------------- 1 | package c26.flywight; 2 | /** 3 | * 實體網站 4 | * @author Yan 5 | * 6 | */ 7 | public class ConcreteWebsite implements Website { 8 | private String name ; 9 | public ConcreteWebsite(String name) { 10 | this.name = name; 11 | } 12 | @Override 13 | public void use(User user) { 14 | System.out.println("網站分類:" + name + " 用戶:"+user.getName()); 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /src/c26/flywight/User.java: -------------------------------------------------------------------------------- 1 | package c26.flywight; 2 | /** 3 | * 不同的網站擁有者 4 | * @author Yan 5 | * 6 | */ 7 | public class User { 8 | private String name; 9 | public User(String name){ 10 | this.name = name; 11 | } 12 | 13 | public String getName(){ 14 | return name; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/c26/flywight/WebSiteFactory.java: -------------------------------------------------------------------------------- 1 | package c26.flywight; 2 | 3 | import java.util.HashMap; 4 | 5 | /** 6 | * 網站工廠 7 | * @author Yan 8 | * 9 | */ 10 | public class WebSiteFactory { 11 | private HashMap flyweights = new HashMap<>(); 12 | /** 13 | * 取得網站分類 14 | * @param key 15 | * @return 16 | */ 17 | public Website getWebsiteCategory(String key){ 18 | if(!flyweights.containsKey(key)){ 19 | flyweights.put(key, new ConcreteWebsite(key)); 20 | } 21 | 22 | return flyweights.get(key); 23 | } 24 | 25 | /** 26 | * 或得目前網站分類數 27 | * @return 28 | */ 29 | public int getWebsiteCount(){ 30 | return flyweights.size(); 31 | } 32 | 33 | } 34 | -------------------------------------------------------------------------------- /src/c26/flywight/Website.java: -------------------------------------------------------------------------------- 1 | package c26.flywight; 2 | 3 | /** 4 | * 網站 5 | * @author Yan 6 | * 7 | */ 8 | public interface Website { 9 | void use(User user); 10 | } 11 | -------------------------------------------------------------------------------- /src/c27/interpreter/Expression.java: -------------------------------------------------------------------------------- 1 | package c27.interpreter; 2 | /** 3 | * 運算式類別 4 | * @author Yan 5 | * 6 | */ 7 | public abstract class Expression { 8 | public void interpret(PlayContext context){ 9 | if(context.getText().length() > 0){ 10 | // 從樂譜取出第一條命令 ex."O 3 E 0.5"取出 playkey = "O",playValue = "3" 11 | String text = context.getText(); 12 | String playKey = text.substring(0, 1); 13 | text = text.substring(2); 14 | String playValue = text.substring(0, text.indexOf(" ")); 15 | context.setText(text.substring(text.indexOf(" ") + 1)); 16 | excute(playKey,playValue); 17 | } 18 | } 19 | 20 | public abstract void excute(String playKey,String playValue); 21 | } 22 | -------------------------------------------------------------------------------- /src/c27/interpreter/Note.java: -------------------------------------------------------------------------------- 1 | package c27.interpreter; 2 | /** 3 | * 音符 4 | * @author Yan 5 | * 6 | */ 7 | public class Note extends Expression { 8 | 9 | @Override 10 | public void excute(String playKey, String playValue) { 11 | String node = ""; 12 | switch(playKey){ 13 | // key = C,演奏1(do) 14 | case "C": node = "1" ; break; 15 | // key = D,演奏2(ri) 16 | case "D": node = "2" ; break; 17 | 18 | case "E": node = "3" ; break; 19 | 20 | case "F": node = "4" ; break; 21 | 22 | case "G": node = "5" ; break; 23 | 24 | case "A": node = "6" ; break; 25 | 26 | case "B": node = "7" ; break; 27 | 28 | } 29 | System.out.print(node+" "); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /src/c27/interpreter/PlayContext.java: -------------------------------------------------------------------------------- 1 | package c27.interpreter; 2 | /** 3 | * 演奏內容 4 | * @author Yan 5 | * 6 | */ 7 | public class PlayContext { 8 | private String text; 9 | /** 10 | * 演奏樂譜 11 | * @return 12 | */ 13 | public String getText() { 14 | return text; 15 | } 16 | 17 | /** 18 | * 設定演奏的樂譜 19 | * @param text 20 | */ 21 | public void setText(String text) { 22 | this.text = text; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/c27/interpreter/Scale.java: -------------------------------------------------------------------------------- 1 | package c27.interpreter; 2 | /** 3 | * 音階 4 | * @author Yan 5 | * 6 | */ 7 | public class Scale extends Expression { 8 | 9 | @Override 10 | public void excute(String playKey, String playValue) { 11 | String node = ""; 12 | switch(playValue){ 13 | case "1": node = "低音" ; break; 14 | case "2": node = "中音" ; break; 15 | case "3": node = "高音" ; break; 16 | } 17 | System.out.print(node+" "); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /src/c28/visitor/Action.java: -------------------------------------------------------------------------------- 1 | package c28.visitor; 2 | /** 3 | * 狀態 4 | * @author Yan 5 | * 6 | */ 7 | public interface Action { 8 | void getManConclusion(Man concreteElementA); 9 | void getWomanConclusion(Woman concreteElementB); 10 | } 11 | -------------------------------------------------------------------------------- /src/c28/visitor/Failing.java: -------------------------------------------------------------------------------- 1 | package c28.visitor; 2 | /** 3 | * 失敗狀態 4 | * @author Yan 5 | * 6 | */ 7 | public class Failing implements Action{ 8 | 9 | @Override 10 | public void getManConclusion(Man concreteElementA) { 11 | System.out.println(concreteElementA.getClass().getSimpleName() + " "+ this.getClass().getSimpleName()+"時,會被女人唾棄"); 12 | } 13 | 14 | @Override 15 | public void getWomanConclusion(Woman concreteElementB) { 16 | System.out.println(concreteElementB.getClass().getSimpleName() + " "+ this.getClass().getSimpleName()+"時,上網QQ找人回收"); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c28/visitor/Man.java: -------------------------------------------------------------------------------- 1 | package c28.visitor; 2 | 3 | public class Man implements Person { 4 | 5 | @Override 6 | public void accept(Action visitor) { 7 | visitor.getManConclusion(this); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /src/c28/visitor/ObjectStructure.java: -------------------------------------------------------------------------------- 1 | package c28.visitor; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | // 物件結構 7 | public class ObjectStructure { 8 | private List elements = new ArrayList<>(); 9 | /** 10 | * 新增 11 | * @param element 12 | */ 13 | public void attach(Person element){ 14 | elements.add(element); 15 | } 16 | /** 17 | * 移除 18 | * @param element 19 | */ 20 | public void detach(Person element){ 21 | elements.remove(element); 22 | } 23 | /** 24 | * 查看顯示 25 | */ 26 | public void display(Action visitor){ 27 | for(Person e : elements){ 28 | e.accept(visitor); 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/c28/visitor/Person.java: -------------------------------------------------------------------------------- 1 | package c28.visitor; 2 | /** 3 | * 人 4 | * @author Yan 5 | * 6 | */ 7 | public interface Person { 8 | /** 9 | * 接受 10 | * @param visitor 用來取得"狀態" 11 | */ 12 | void accept(Action visitor); 13 | } 14 | -------------------------------------------------------------------------------- /src/c28/visitor/Success.java: -------------------------------------------------------------------------------- 1 | package c28.visitor; 2 | /** 3 | * 成功狀態 4 | * @author Yan 5 | * 6 | */ 7 | public class Success implements Action{ 8 | 9 | @Override 10 | public void getManConclusion(Man concreteElementA) { 11 | System.out.println(concreteElementA.getClass().getSimpleName() + " "+ this.getClass().getSimpleName()+"時,背後多半有一個偉大的女人"); 12 | } 13 | 14 | @Override 15 | public void getWomanConclusion(Woman concreteElementB) { 16 | System.out.println(concreteElementB.getClass().getSimpleName() + " "+ this.getClass().getSimpleName()+"時,背後多半有一個QQ的男人"); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /src/c28/visitor/Woman.java: -------------------------------------------------------------------------------- 1 | package c28.visitor; 2 | 3 | public class Woman implements Person { 4 | 5 | @Override 6 | public void accept(Action visitor) { 7 | visitor.getWomanConclusion(this); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /uml/AbstractFactory.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 43 | 44 | 46 | 47 | 48 | 49 | 50 | 52 | 53 | 55 | 56 | 57 | 58 | 59 | 61 | 62 | 64 | 65 | 66 | 67 | 68 | 70 | 71 | 73 | 74 | 75 | 76 | 77 | 79 | 80 | 82 | 83 | 84 | 85 | 86 | 88 | 89 | 91 | 92 | 93 | 94 | 95 | 97 | 98 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 171 | 172 | 173 | 174 | 175 | -------------------------------------------------------------------------------- /uml/Adapter.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /uml/Bridge.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 51 | 52 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /uml/Builder.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /uml/ChainOfResponsibility.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 16 | 17 | 19 | 20 | 21 | 22 | 23 | 26 | 27 | 29 | 30 | 31 | 32 | 33 | 35 | 36 | 38 | 39 | 40 | 41 | 42 | 45 | 46 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 85 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /uml/Command.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 51 | 52 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /uml/Composite.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /uml/Decorator.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 67 | 68 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /uml/Facade.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 96 | 97 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /uml/Factory.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 51 | 52 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 88 | 89 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /uml/Flyweight.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /uml/Interpreter.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /uml/Iterator.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 71 | 72 | 73 | 74 | 75 | -------------------------------------------------------------------------------- /uml/Mediator.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /uml/Memento.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /uml/Observer.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 51 | 52 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 101 | 102 | 103 | 104 | 105 | -------------------------------------------------------------------------------- /uml/SimpleFactory.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 51 | 52 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /uml/Singleton.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /uml/State.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 45 | 46 | 47 | 48 | 49 | 51 | 52 | 54 | 55 | 56 | 57 | 58 | 60 | 61 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 97 | 98 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /uml/Strategy.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 25 | 26 | 28 | 29 | 30 | 31 | 32 | 34 | 35 | 37 | 38 | 39 | 40 | 41 | 43 | 44 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /uml/Template.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /uml/Visitor.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /uml/prototype.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /uml/proxy.ucls: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 15 | 16 | 18 | 19 | 20 | 21 | 22 | 24 | 25 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 49 | 50 | 51 | 52 | 53 | --------------------------------------------------------------------------------