




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第2章1.某基于\o"Java知識庫"Java的C/S系統的“登錄功能”通過如下登錄類(Login)實現,請指出設計存在的問題,并基于單一職責原則進行重構。
答案:
功能太過于集成,嚴重違反類的單一原則。就一個類而言,應該僅有一個引起它變化的原因。2.某圖形界面系統提供了各種不同形狀的按鈕,客戶端代碼可針對這些按鈕進行編程,用戶可能會改變需求要求使用不同的按鈕,原始設計方案如圖所示,請指出設計存在的問題,并基于開閉原則對該系統進行重構。答案:客戶端的一個方法直接調用加法類,當需要變更,如想添加一個減法類時就得改變加法類中代碼(用switch語句實現),這就違背了“開閉原則”,應該進行重構。3.
某系統需要實現對重要數據(如用戶密碼)的加密處理,在數據操作類(DataOperator)中需要調用加密類中定義的加密\o"算法與數據結構知識庫"算法,系統提供了兩個不同的加密類,CipherA和CipherB,它們實現不同的加密方法,在DataOperator中可以選擇其中的一個實現加密操作。請指出設計存在的問題,并基于里氏代換原則進行重構。
答案:因為如果需要更換一個加密算法類或者增加并使用一個新的加密算法類,如將CipherA改為CipherB,則需要修改客戶類Client和數據操作類DataOperator的源代碼,違背了開閉原則。現使用里氏代換原則對其進行重構,使得系統可以靈活擴展,符合開閉原則。子類型必須能夠替換掉它們的父類型。4.某系統提供一個數據轉換模塊,可以將來自不同數據源的數據轉換成多種格式,如可以轉換來自數據庫的數據(DatabaseSource)、也可以轉換來自文本文件的數據(TextSource),轉換后的格式可以是XML文件(XMLTransformer)、也可以是XLS文件(XLSTransformer),原始設計方案如圖所示,請指出設計存在的問題,并基于依賴倒轉原則進行重構。答案:因為該系統可能需要增加新的數據源或者新的文件格式,每增加一個新類型的數據源或者新類型的文件格式,客戶類MainClass都需要修改源代碼,以便使用新的類,這樣就違背了開閉原則。因此使用依賴倒轉原則對其進行重構。5.一個擁有多個客戶類的系統,在系統中定義了一個巨大的接口(胖接口)AbstractService來服務所有的客戶類。如圖所示,請指出設計存在的問題,并基于接口分離原則進行重構。答案:類應該完全依賴相應的專門的接口,這樣一個功能集中的接口違背了接口隔離原則,一旦針對某個客戶的方法發生改變,就需要進行重新編譯和發布,因此其他客戶都會受到影響。因為這樣做既滿足了接口隔離原則,又滿足了單一原則,何樂而不為呢,但是也帶來了很多的不便,類增多了。6.某教學管理系統部分\o"MySQL知識庫"數據庫訪問類設計如圖所示,請指出設計存在的問題,并基于合成復用原則進行重構。答案:因為如果需要更換數據庫連接方式,則需要修改DBUtil類源代碼。例如如原來采用JDBC連接數據庫,現在采用數據庫連接池連接;如果StudentDAO采用JDBC連接,但是TeacherDAO采用連接池連接,則需要增加一個新的DBUtil類,并修改StudentDAO或TeacherDAO的源代碼,使之繼承新的數據庫連接類,這樣導致違背開閉原則,系統擴展性較差,應盡量使用對象組合而不是用繼承來達到復用的目的。7.某系統界面類(如Form1、Form2等類)與數據訪問類(如DAO1、DAO2等類)設計如圖,類之間的調用關系較為復雜。請指出設計存在的問題,并基于迪米特法則進行重構。答案:由于界面控件之間的交互關系復雜,導致在該窗口中增加新的界面控件時,需要修改與之交互的其他控件的源代碼,系統擴展性較差,也不便于增加和刪除新控件。違反了一個軟件實體應當盡可能少的與其他實體發生相互作用的原則,即違反迪米特法則。這樣就可以降低類的耦合性,是類中功能更加單一,相當于外觀模式。第3章1.有一系列的自動車產品Bus(公交車),Truck(卡車);它們需要由不同的工廠生產,但具有相同的生產流程。為了以后擴展其他流水線,比如摩托車,我們需要一種柔軟的方案來實現自動車生產的過程。請基于Java分別用工廠方法、抽象工廠方法兩種設計模式加以實現。參考答案:1)工廠方法:classCarFactory{publicCarcreateCar(StringcarType){ if(carType.equals(“BUS”))ReturnnewCarBus(); if(carType.equals(“TRUCK”))ReturnnewCarTruck();}} publicclassClient{ publicstaticvoidmain(String[]args){ CarFactoryfactory=newCarFactory(); //生產公交車 Carbus=factory.createCar(“BUS”); System.out.println("生產了:"+bus.getType()); //生產卡車 Cartruck=factory.createCar(“TRUCK”); System.out.println("生產了:"+truck.getType()); } }2)抽象工廠方法:abstractclassCarFactory{ //定義生產自動車生產的接口規范 publicCarcreateCar(); } classBusFactoryextendsCarFactory{ publicCarcreateCar(){ //生產公交車 returnnewCarBus(); } } classTruckFactoryextendsCarFactory{ publicCarcreateCar(){ //生產卡車 returnnewTruckBus(); } } publicclassCar{ publicStringgetType(){ return"Car"; } } publicclassCarBusextendsCar{ publicStringgetType(){ return"Bus"; } } publicclassCarTruckextendsCar{ publicStringgetType(){ return"Truck"; } } publicclassClient{ publicstaticvoidmain(String[]args){ CarFactoryfactory=newBusFactory(); //生產公交車 Carbus=factory.createCar(); System.out.println("生產了:"+bus.getType()); factory=newTruckFactory(); //生產卡車 Cartruck=factory.createCar(); System.out.println("生產了:"+truck.getType()); } }2.請基于Java設計一個單例模式的程序,驗證單例模式的實例有且僅有一個。參考答案:publicclassSingleton{privatestaticSingletons;publicstaticSingletongetInstance(){if(s==null)s=newSingleton();returns;}}//測試類classsingletonTest{publicstaticvoidmain(String[]args){Singletons1=Singleton.getInstance();Singletons2=Singleton.getInstance();if(s1==s2)System.out.println("s1isthesameinstancewiths2");elseSystem.out.println("s1isnotthesameinstancewiths2");}}singletonTest運行結果是:s1isthesameinstancewiths23.某圖形編輯器的原型模式設計方案如下圖,首先創建一個抽象類
Shape
和擴展了
Shape
類的實體類,其次是定義類
ShapeCache,該類把shape對象存儲在一個Hashtable
中,并在請求的時候返回它們的克隆。請基于Java著手實現。參考答案:步驟1、創建一個實現了
Clonable
接口的抽象類。Shape.javapublicabstractclassShapeimplementsCloneable{privateStringid;protectedStringtype;abstractvoiddraw();publicStringgetType(){returntype;}publicStringgetId(){returnid;}publicvoidsetId(Stringid){this.id=id;}publicObjectclone(){Objectclone=null;try{clone=super.clone();}catch(CloneNotSupportedExceptione){e.printStackTrace();}returnclone;}}步驟2、創建擴展了上面抽象類的實體類。Rectangle.javapublicclassRectangleextendsShape{publicRectangle(){type="Rectangle";}@Overridepublicvoiddraw(){System.out.println("InsideRectangle::draw()method.");}}Square.javapublicclassSquareextendsShape{publicSquare(){type="Square";}@Overridepublicvoiddraw(){System.out.println("InsideSquare::draw()method.");}}Circle.javapublicclassCircleextendsShape{publicCircle(){type="Circle";}@Overridepublicvoiddraw(){System.out.println("InsideCircle::draw()method.");}}步驟3、創建一個原型管理器類,從數據庫獲取實體類,并把它們存儲在一個Hashtable中。ShapeCache.javaimportjava.util.Hashtable;publicclassShapeCache{privatestaticHashtable<String,Shape>shapeMap=newHashtable<String,Shape>();publicstaticShapegetShape(StringshapeId){ShapecachedShape=shapeMap.get(shapeId);return(Shape)cachedShape.clone();}//對每種形狀都運行數據庫查詢,并創建該形狀//shapeMap.put(shapeKey,shape);//例如,我們要添加三種形狀publicstaticvoidloadCache(){Circlecircle=newCircle();circle.setId("1");shapeMap.put(circle.getId(),circle);Squaresquare=newSquare();square.setId("2");shapeMap.put(square.getId(),square);Rectanglerectangle=newRectangle();rectangle.setId("3");shapeMap.put(rectangle.getId(),rectangle);}}步驟4、PrototypePatternDemo使用ShapeCache類來獲取存儲在Hashtable中的形狀的克隆。PrototypePatternDemo.javapublicclassPrototypePatternDemo{publicstaticvoidmain(String[]args){ShapeCache.loadCache();ShapeclonedShape=(Shape)ShapeCache.getShape("1");System.out.println("Shape:"+clonedShape.getType()); ShapeclonedShape2=(Shape)ShapeCache.getShape("2");System.out.println("Shape:"+clonedShape2.getType()); ShapeclonedShape3=(Shape)ShapeCache.getShape("3");System.out.println("Shape:"+clonedShape3.getType()); }}步驟5、驗證輸出。Shape:CircleShape:SquareShape:Rectangle4.以組裝電腦為例,請基于Java利用創建者模式實現電腦產品的組裝實現。參考答案:1)在這里,我們先定義商品Commodity(Product)類:publicclassCommodity{Stringcommodity="";publicCommodity(PartpartA,PartpartB,PartpartC){//由各個部分組成this.commodity=partA.part+"\n";this.commodity=product+partB.part+"\n";this.commodity=product+partC.part;System.out.println("我的機器配置為:\n"+commodity);}}2)接下來我們再定義電腦的組成部分(Part)類:publicclassPart{Stringpart="";publicPart(Stringpart){this.part=part;}}3)我們把電腦Computer(Builder)定義成一個接口類:publicinterfaceComputer{//組裝部件A比如CPUvoidbuildPartA();//組裝部件B比如主板voidbuildPartB();//組裝部件C比如硬盤voidbuildPartC();//返回最后組裝成品結果(返回最后組裝好的電腦)//成品的組裝過程不在這里進行,而是由組裝師(Assembler)類完成的。//從而實現了過程和部件的分離ProductgetProduct();}4)定義電腦的組裝師Assembler(Director)類:publicclassAssembler{privateComputercomputer;publicAssembler(Computercomputer){//主要任務是裝電腦puter=computer;}//將部件partApartBpartC最后組成復雜對象//這里是將主板、CPU和硬盤組裝成PC的過程publicvoidconstruct(){computer.buildPartA();computer.buildPartB();computer.buildPartC();}}5)我的電腦是對電腦接口的具體實現,因此再定義MyComputer實現類(ConcreteBuilder):publicclassMyComputerimplementsComputer{PartpartA,partB,partC;publicvoidbuildPartA(){partA=newPart("P42.4CPU");}publicvoidbuildPartB(){partB=newPart("Inter主板");}publicvoidbuildPartC(){partC=newPart("80G硬盤");}publicProductgetProduct(){//返回最后組裝成品結果CommoditymyComputer=newCommodity(partA,partB,partC);returnmyComputer;}}6)編寫測試類:publicclassMyComputerTest{publicstaticvoidmain(Stringargs[]){MyComputermyComputer=newMyComputer();//組裝我的電腦Assemblerassembler=newAssembler(myComputer);//派某一位組裝師assembler.construct();//組裝師進行組裝過程Commoditycommodity=myComputer.getProduct();//賣給我的電腦(商品)}}5.四只小花貓參加唱歌比賽,比賽要求五只參賽,他們只有四只,他們把小花狗忽悠進來了,可小花狗不會sing,請基于Java利用適配器模式幫幫它們。參考答案:1)Cat.javapublicinterfaceCat{publicvoidsing();}2)SmallFlowerCat.javapublicclassSmallFlowerCatimplementsCat{privateStringname;publicSmallFlowerCat(Stringname){=name;}@Overridepublicvoidsing(){System.out.println(name+"--喵~");}}3)Dog.javapublicclassDog{publicvoidbake(){System.out.println("汪汪~");}}4)CatAdapter.javapublicclassCatAdapterimplementsCat{privateDogmDog;publicCatAdapter(Dogdog){mDog=dog;}@Overridepublicvoidsing(){mDog.bake();}}5)Test.javaimportjava.util.ArrayList;publicclassTest{publicstaticvoidmain(Stringargs[]){ArrayList<Cat>catArrayList=newArrayList<Cat>();Dogdog=newDog();for(inti=0;i<4;i++){SmallFlowerCatcat=newSmallFlowerCat("小花貓"+(i+1)+"號");catArrayList.add(cat);}CatdogToCat=newCatAdapter(dog);catArrayList.add(dogToCat);for(Catc:catArrayList){c.sing();}}}測試結果:小花貓1號--喵~小花貓2號--喵~小花貓3號--喵~小花貓4號--喵~汪汪~6.利用組合模式實現一個樹形菜單的創建。通過Javaswing的JTree組件,節點實現類為DefaultMutableTreeNode,用于創建根節點、子節點和孫節點對象,再通過DefaultTreeModel類利用根節點創建樹模型對象,然后通過treeModel.insertNodeInto方法將節點對象插入樹模型中。創建樹形菜單結構與創建菜單欄類似,都是按層次與模型創建的。參考答案:importjava.awt.*;importjavax.swing.*;importjavax.swing.tree.*;importjavax.swing.event.*;publicclassTreeextendsJFrameimplementsTreeSelectionListener{privateJLabellabel;publicTree(){super("樹形菜單");setSize(400,400);Containercontainer=getContentPane();//創建根節點和子節點DefaultMutableTreeNoderoot=newDefaultMutableTreeNode("文本編輯器");DefaultMutableTreeNodenode1=newDefaultMutableTreeNode("文件");DefaultMutableTreeNodenode2=newDefaultMutableTreeNode("編輯");//利用根節點創建TreeModelDefaultTreeModeltreeModel=newDefaultTreeModel(root);//插入子節點node1,node2treeModel.insertNodeInto(node1,root,root.getChildCount());treeModel.insertNodeInto(node2,root,root.getChildCount());//創建節點node1的子節點并插入DefaultMutableTreeNodeleafnode=newDefaultMutableTreeNode("打開");treeModel.insertNodeInto(leafnode,node1,node1.getChildCount());leafnode=newDefaultMutableTreeNode("保存");treeModel.insertNodeInto(leafnode,node1,node1.getChildCount());leafnode=newDefaultMutableTreeNode("另存為");treeModel.insertNodeInto(leafnode,node1,node1.getChildCount());leafnode=newDefaultMutableTreeNode("關閉");treeModel.insertNodeInto(leafnode,node1,node1.getChildCount());//創建節點node2的子節點并插入leafnode=newDefaultMutableTreeNode("剪切");treeModel.insertNodeInto(leafnode,node2,node2.getChildCount());leafnode=newDefaultMutableTreeNode("復制");treeModel.insertNodeInto(leafnode,node2,node2.getChildCount());leafnode=newDefaultMutableTreeNode("粘貼");treeModel.insertNodeInto(leafnode,node2,node2.getChildCount());//創建樹對象JTreetree=newJTree(treeModel);//設置Tree的選擇為一次只能選擇一個節點tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);//注冊監聽器tree.addTreeSelectionListener(this);tree.setRowHeight(20);//創建節點繪制對象DefaultTreeCellRenderercellRenderer=(DefaultTreeCellRenderer)tree.getCellRenderer();//設置字體cellRenderer.setFont(newFont("Serif",Font.PLAIN,14));cellRenderer.setBackgroundNonSelectionColor(Color.white);cellRenderer.setBackgroundSelectionColor(Color.yellow);cellRenderer.setBorderSelectionColor(Color.red);//設置選或不選時,文字的變化顏色cellRenderer.setTextNonSelectionColor(Color.black);cellRenderer.setTextSelectionColor(Color.blue);//把樹對象添加到內容面板container.add(newJScrollPane(tree));//創建標簽label=newJLabel("你當前選擇的節點為:",JLabel.CENTER);label.setFont(newFont("Serif",Font.PLAIN,14));container.add(label,BorderLayout.SOUTH);setVisible(true);//設置可見setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置窗口關閉動作}//處理TreeSelectionEvent事件publicvoidvalueChanged(TreeSelectionEventevent){JTreetree=(JTree)event.getSource();//獲取目前選取的節點DefaultMutableTreeNodeselectionNode=(DefaultMutableTreeNode)tree.getLastSelectedPathComponent();StringnodeName=selectionNode.toString();label.setText("你當前選取的節點為:"+nodeName);}publicstaticvoidmain(Stringargs[]){Treed=newTree();}}7.請基于Java使用裝飾模式模擬項目經理接到一個項目,項目最終要完成編碼的工作。項目經理接到項目后,先做些前期的工作(比如需求分析、設計),然后將編碼工作委派給程序員,程序員干完后,項目經理做項目的收尾工作。參考答案:publicinterfaceProject{voiddoCoding();}publicclassEmployeimplementsProject{publicvoiddoCoding(){System.out.println("代碼工人在編寫代碼,加班編啊編啊,終于編完了!");}}publicclassManagerimplementsProject{privateProjectproject;//實際上存放的是代碼工人對象publicManager(Projectproject){ject=project;}publicvoiddoCoding(){//項目經理開始新的工作startNewWork();}/***模板:定義項目經理自己的事情*/publicvoidstartNewWork(){//項目經理在做早期工作doEarlyWork();//項目經理很牛,做完需求和設計后,直接將編碼委派給代碼工人干project.doCoding();//項目經理在做收尾工作doEndWork();}/***項目經理自己的事情:做早期工作*/publicvoiddoEarlyWork(){}/***項目經理做收尾工作*/publicvoiddoEndWork(){}}publicclassManagerAextendsManager{publicManagerA(Projectproject){super(project);}/***項目經理自己的事情:做早期工作*/publicvoiddoEarlyWork(){System.out.println("項目經理A在做需求分析");System.out.println("項目經理A在做架構設計");System.out.println("項目經理A在做詳細設計");}}publicclassManagerBextendsManager{publicManagerB(Projectproject){super(project);}/***項目經理自己的事情:做早期工作*/publicvoiddoEarlyWork(){System.out.println("項目經理B在做需求分析");System.out.println("項目經理B在做詳細設計");}/***項目經理做收尾工作*/publicvoiddoEndWork(){System.out.println("項目經理B在做收尾工作");}}publicclassClient{publicstaticvoidmain(Stringargs[]){Projectemploye=newEmploye();//代碼工人ProjectmanagerA=newManagerA(employe);//項目經理ProjectmanagerB=newManagerB(employe);//項目經理//以經理的名義將編碼完成,功勞都是經理的,實際編碼的是工人managerA.doCoding();managerB.doCoding();}}運行結果:項目經理A在做需求分析項目經理A在做架構設計項目經理A在做詳細設計代碼工人在編寫代碼,加班編啊編啊,終于編完了!項目經理B在做需求分析項目經理B在做詳細設計代碼工人在編寫代碼,加班編啊編啊,終于編完了!項目經理B在做收尾工作8.請基于Java通過外觀模式實現在文件柜中尋找文件的管理。文件放在文件柜的第二個抽屜里,但是它的鑰匙必須從第一個抽屜里獲得。packagefacade;classDrawerOne{publicvoidopen(){System.out.println("第一個抽屜被打開了");getKey();}publicvoidgetKey(){System.out.println("得到第二個抽屜的鑰匙");}}classDrawerTwo{publicvoidopen(){System.out.println("第二個抽屜被打開了");getFile();}publicvoidgetFile(){System.out.println("得到這個重要文件");}}classDrawerFacade{DrawerOnedarwerOne=newDrawerOne();DrawerTwodarwerTwo=newDrawerTwo();publicvoidopen(){darwerOne.open();darwerTwo.open();}}publicclassDrawerClient{publicstaticvoidmain(String[]args){DrawerFacadedrawer=newDrawerFacade();drawer.open();}}9.一個咖啡店有幾種口味的咖啡(拿鐵、摩卡、卡布奇諾等等),如果這家店接到訂單要幾十杯咖啡,那么顯然咖啡的口味就可以設置成共享的,而不必為每一杯單獨生成。請基于Java使用享元模式實現咖啡供應管理。參考答難:publicabstractclassOrder{//執行賣出動作,抽象享元接口publicabstractvoidsell();}publicclassFlavorOrderextendsOrder{//具體享元類publicStringflavor;//獲取咖啡口味publicFlavorOrder(Stringflavor){this.flavor=flavor;}@Overridepublicvoidsell(){System.out.println("賣出一份"+flavor+"的咖啡。");}}importjava.util.HashMap;importjava.util.Map;publicclassFlavorFactory{ privateMap<String,Order>flavorPool=newHashMap<String,Order>(); //靜態工廠,負責生成訂單對象,享元工廠 privatestaticFlavorFactoryflavorFactory=newFlavorFactory(); privateFlavorFactory(){ } publicstaticFlavorFactorygetInstance(){ returnflavorFactory; } publicOrdergetOrder(Stringflavor){ Orderorder=null; if(flavorPool.containsKey(flavor)){//如果此映射包含指定鍵的映射關系,則返回true order=flavorPool.get(flavor); }else{ order=newFlavorOrder(flavor); flavorPool.put(flavor,order); } returnorder; } publicintgetTotalFlavorsMade(){ returnflavorPool.size(); } }importjava.util.*;publicclassClient{//客戶下的訂單privatestaticList<Order>orders=newArrayList<Order>();//訂單對象生成工廠privatestaticFlavorFactoryflavorFactory;//增加訂單privatestaticvoidtakeOrders(Stringflavor){orders.add(flavorFactory.getOrder(flavor));}publicstaticvoidmain(String[]args){//訂單生成工廠flavorFactory=FlavorFactory.getInstance();//增加訂單takeOrders("摩卡");takeOrders("卡布奇諾");takeOrders("香草星冰樂");takeOrders("香草星冰樂");takeOrders("拿鐵");takeOrders("卡布奇諾");takeOrders("拿鐵");takeOrders("卡布奇諾");takeOrders("摩卡");takeOrders("香草星冰樂");takeOrders("卡布奇諾");takeOrders("摩卡");takeOrders("香草星冰樂");takeOrders("拿鐵");takeOrders("拿鐵");//賣咖啡for(Orderorder:orders){order.sell();}//打印生成的訂單java對象數量System.out.println("\n客戶一共買了"+orders.size()+"杯咖啡!");//打印生成的訂單java對象數量System.out.println("共生成了"+flavorFactory.getTotalFlavorsMade()+"個FlavorOrderjava對象!");}}賣出一份摩卡的咖啡。賣出一份卡布奇諾的咖啡。賣出一份香草星冰樂的咖啡。賣出一份香草星冰樂的咖啡。賣出一份拿鐵的咖啡。賣出一份卡布奇諾的咖啡。賣出一份拿鐵的咖啡。賣出一份卡布奇諾的咖啡。賣出一份摩卡的咖啡。賣出一份香草星冰樂的咖啡。賣出一份卡布奇諾的咖啡。賣出一份摩卡的咖啡。賣出一份香草星冰樂的咖啡。賣出一份拿鐵的咖啡。賣出一份拿鐵的咖啡。客戶一共買了15杯咖啡!共生成了4個FlavorOrderjava對象!10.一個紅酒廠商是不會直接把紅酒零售客戶的,都是通過代理來完成他的銷售業務的,而客戶也不用為了喝紅酒而到處找工廠,他只要找到廠商在當地的代理就行了。具體紅酒工廠在那里,客戶不用關心,代理會幫他處理。請基于Java代理模式實現這個需求。參考答案:紅酒代理商和紅酒廠商都有銷售紅酒的職能,可以為他們定義一個共同的抽象主題角色。/***抽象主題角色,定義了真實角色和代理角色的公共接口。*/publicinterfaceSellInterface{publicObjectsell();}/***真實主題角色,這里指紅酒工廠角色,它實現了SellInterface接口*/publicclassRedWineFactoryimplementsSellInterface{publicObjectsell(){System.out.println("真實主題角色RedWineFactory被調用了");returnnewObject();}}/***代理主題角色,這里指紅酒代理商,它除了也要實現了sellInterface接口外,還持有紅酒*廠商RedWineFactory對象的引用,從而使它能在調用真實主題前后做一些必要處理。*/publicclassRedWineProxyimplementsSellInterface{//持有一個RedWineFactory對象的引用privateRedWineFactoryredWineFactory;//銷售總量privatestaticintsell_count=0;publicObjectsell(){if(checkUser()){//在通過代理主題角色,我們可以在真實主題角色被調用前做一些諸如權限判斷的事情Objectobj=redWineFactory.sell();count++;//同樣,在調用后我們也可以執行一些額外的動作.returnobj;}else{thrownewRuntimeException();}}protectedbooleancheckUser(){//dosomethingreturntrue;}}//測試類主程序publicclassClient{publicstaticvoidmain(Stringagr[]){SellInterfacesell=newRedWineProxy();sell.sell();}}11.對于筆記本的CPU評測,當安裝IntelCPU的時候評測分數比較高,而安裝AMDCPU的時候則評測分數相對低一些,這個是一維影響,而配合上電腦品牌,就是二維影響。請基于Java實現橋接模式的不同品牌筆記本性能評測。參考答案:interfaceCpuAbility{StringabilityCpu();}classAmdCpuimplementsCpuAbility{publicStringabilityCpu(){return"性能一般";}}classIntelCpuimplementsCpuAbility{publicStringabilityCpu(){return"性能較好";}}abstractclassAbstractComputer{CpuAbilitycpuAbility;publicAbstractComputer(CpuAbilitycpuAbility){this.cpuAbility=cpuAbility;}publicabstractvoidcheckPcAbility();}classLenevoComputerextendsAbstractComputer{publicLenevoComputer(CpuAbilitycpuAbility){super(cpuAbility);}@OverridepublicvoidcheckPcAbility(){System.out.println("華碩筆記本CPU性能"+super.cpuAbility.abilityCpu());}}classIswComputerextendsAbstractComputer{publicIswComputer(CpuAbilitycpuAbility){super(cpuAbility);}@OverridepublicvoidcheckPcAbility(){System.out.println("IBM筆記本CPU性能"+super.cpuAbility.abilityCpu());}}//執行代碼并輸出publicclassClient{publicstaticvoidmain(Stringagr[]){CpuAbilityability=newIntelCpu();AbstractComputercomputer=newLenevoComputer(ability);computer.checkPcAbility();ability=newAdmCpu();//華碩筆記本CPU性能較好computer=newIswComputer(ability);computer.checkPcAbility();//IBM筆記本CPU性能一般}}12.文檔編輯是我們日常不可或缺的一項工作,包括顯示文檔、編輯文檔(撤銷、重做),請基于Java利用命令模式實現文檔編輯任務。參考答案:classDocument{//Receiver:請求接收者,負責執行各命令publicvoiddisplay(){//顯示命令System.out.println("顯示文檔內容");}publicvoidundo(){//撤消命令System.out.println("撤銷文檔內容");}publicvoidredo(){System.out.println("重做文檔內容");}}interfaceDocumentCommand{//Command:抽象的接口,對多種命令進行抽象publicvoidexecute();}classDisplayCommandimplementsDocumentCommand{//具體命令,要聚集一個命令接收對象,并在執行方法中將命令執行轉發給接收者privateDocumentdocument;publicDisplayCommand(Documentdoc){document=doc;}@Overridepublicvoidexecute(){document.display();}}classUndoCommandimplementsDocumentCommand{//具體命令privateDocumentdocument;publicUndoCommand(Documentdoc){document=doc;}@Overridepublicvoidexecute(){document.undo();}}classRedoCommandimplementsDocumentCommand{//具體命令privateDocumentdocument;publicRedoCommand(Documentdoc){document=doc;}@Overridepublicvoidexecute(){document.redo();}}classDocumentInvoker{//Invoker:命令請求者privateDisplayCommand_dcmd;privateUndoCommand_ucmd;privateRedoCommand_rcmd;publicDocumentInvoker(DisplayCommanddcmd,UndoCommanducmd,RedoCommandrcmd){this._dcmd=dcmd;this._ucmd=ucmd;this._rcmd=rcmd;}publicvoiddisplay(){//調用命令對象執行請求,即把命令執行轉發給命令對象_dcmd.execute();}publicvoidundo(){_ucmd.execute();}publicvoidredo(){_rcmd.execute();}/*要對請求進行排隊、調度時可用下面的方式實現privatejava.util.ArrayList<Command>comList=newjava.util.ArrayList<Command>();publicvoidaddCommand(Commandcom){comList.add(com);}publicvoidschedulePerform(){for(Commandco:comList){co.execute();}}*/}publicclassCommandTest{publicstaticvoidmain(String[]args){Documentdoc=newDocument();//客戶端要把接收者對象傳給具體命令對象DisplayCommanddisplay=newDisplayCommand(doc);UndoCommandundo=newUndoCommand(doc);RedoCommandredo=newRedoCommand(doc);DocumentInvokerinvoker=newDocumentInvoker(display,undo,redo);invoker.display();invoker.undo();invoker.redo();}}13.軟件項目要求在規定的時間內完成,軟件開發是有工序(Procedure)要求的,例如首先先由分析設計人員對系統進行分析設計,然后再由程序員進行編碼,最后再由測試人員對整個系統進行測試。請基于Java利用職責鏈模式實現項目管理。參考答案://先定義工序接口類(Handler)publicinterfaceProcedure{publicabstractvoidnextProcedure(Procedureprocedure);//下一工序publicabstractvoidexecuteProcedure(Stringaim);//執行工序}//分析設計工序(DesignProcedure)publicclassDesignProcedureimplementsProcedure{privateProcedurenextProcedure=null;privateStringprocedureName="Design";//該工序名publicvoidnextProcedure(Procedureprocedure){//下一工序nextProcedure=procedure;}publicvoidexecuteProcedure(StringcurrentProcedure){//執行工序if(currentProcedure.equals(procedureName)){//如果當前工序和該工序相符System.out.println("進行系統分析設計");}else{if(nextProcedure!=null){//如果當前工序和該工序不相符則轉入下一工序nextProcedure.executeProcedure(currentProcedure);}}}}//編碼工序(CodeProcedure)publicclassCodeProcedureimplementsProcedure{privateProcedurenextProcedure=null;privateStringprocedureName="Code";//該工序名publicvoidnextProcedure(Procedureprocedure){//下一工序nextProcedure=procedure;}publicvoidexecuteProcedure(StringcurrentProcedure){//執行工序if(currentProcedure.equals(procedureName)){//如果當前工序和該工序相符System.out.println("進行編碼工作");}else{if(nextProcedure!=null){//如果當前工序和該工序不相符則轉入下一工序nextProcedure.executeProcedure(currentProcedure);}}}}//測試工序(TestProcedure)publicclassTestProcedureimplementsProcedure{privateProcedurenextProcedure=null;privateStringprocedureName="Test";//該工序名publicvoidnextProcedure(Procedureprocedure){//下一工序nextProcedure=procedure;}publicvoidexecuteProcedure(StringcurrentProcedure){//執行工序if(currentProcedure.equals(procedureName)){//如果當前工序和該工序相符System.out.println("進行系統測試");}else{if(nextProcedure!=null){//如果當前工序和該工序不相符則轉入下一工序nextProcedure.executeProcedure(currentProcedure);}}}}//編寫測試類(Client):publicclasstest{publicstaticvoidmain(String[]args){DesignProceduredesign=newDesignProcedure();//分析設計工序CodeProcedurecode=newCodeProcedure();//編碼工序TestProceduretest=newTestProcedure();//測試工序design.nextProcedure(code);//定義分析設計工序的下一工序code.nextProcedure(test);//定義編碼工序的下一工序design.executeProcedure("Design");//開始執行工序design.executeProcedure("Code");design.executeProcedure("Test");}本例中,分析設計工序(DesignProcedure)、編碼工序(CodeProcedure)和測試工序(TestProcedure)中的executeProcedure執行工序方法中都對當前工序和該工序進行了判斷,如果當前工序和該工序相符就執行該工序,如果當前工序和該工序不相符則轉入下一工序執行。14.以實現加減算法的公式為例,公式中僅有兩類元素:運算元素和運算符號。所有的運算元素具有相同的功能,可以用一個類表示,而運算符號則是需要分別進行解釋,加法需要加法解釋器,減法需要減法解釋器。請基于Java利用解釋器模式解析一個四則運算的固定語法邏輯。參考答案:importjava.util.HashMap;importjava.util.Map;importjava.util.Stack;importjava.io.*;abstractclassExpression{//解析公式和數值,其中var中的key值是公式中的參數,value是具體的數字publicabstractintinterpreter(HashMap<String,Integer>var);}classAddExpressionextendsSymbolExpression{publicAddExpression(Expression_left,Expression_right){super(_left,_right);}@Overridepublicintinterpreter(HashMap<String,Integer>var){returnerpreter(var)+erpreter(var);}}classSubExpr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ERP理論知識期中考試試題及答案
- creo考試試題及答案
- 農業產業集群數字化轉型與智慧農業發展研究報告
- 新能源汽車驅動電機振動噪聲控制技術報告2025
- 校長在中考出征儀式上講話少年出征 中考必勝
- 2025放射技士考試試題及答案
- 8級車工考試試題及答案
- 2025關于貨車轉讓合同的范本
- 新生兒的發育及護理注意事項
- 安徽省名校2022-2023學年高二下學期開學考試化學含解析
- 網絡協議2025年考試試題及答案
- 數據投資、數據共享與數據產權的法律問題探討
- 2025年城市管理執法考試試卷及答案
- 2025年網絡輿情監測與危機應對考試題及答案
- 2025年數據工程師考試試題及答案分享
- 網絡與信息安全管理員考試題+參考答案解析
- 2025年高級經濟師(運輸經濟)實務考試真題卷含解析
- 視頻錄制合同協議書
- 退役士兵勞動合同協議
- 八年級會考地理試卷及答案人教版
- 校辦文員筆試題目及答案
評論
0/150
提交評論