ImageVerifierCode 换一换
格式:PPT , 页数:30 ,大小:2.21MB ,
资源ID:389887      下载积分:2000 积分
快捷下载
登录下载
邮箱/手机:
温馨提示:
如需开发票,请勿充值!快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝扫码支付 微信扫码支付   
注意:如需开发票,请勿充值!
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【http://www.mydoc123.com/d-389887.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第十七章 设计样式简介.ppt)为本站会员(rimleave225)主动上传,麦多课文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知麦多课文库(发送邮件至master@mydoc123.com或直接QQ联系客服),我们立即给予删除!

第十七章 设计样式简介.ppt

1、第十七章 設計樣式簡介,課前指引 本章介紹基本的設計樣式以及其概念。設計樣式是一門很專業的物件導向軟體設計知識,並且是軟體設計上相當熱門的話題。在書中,我們從三大類設計樣式中挑選幾個簡單易懂的樣式來做介紹;另外,也將探討幾個在書中範例計畫所採用的設計樣式及其目的。,章節大綱,備註:可依進度點選小節,章首示意圖,17-1 簡介,17-4 結構樣式,17-3 行為樣式,17-2 建構樣式,章首示意圖,17-1 簡介,樣式這個概念首先是出現在建築工程中。樣式是由Christopher Alexander在他所著之”A pattern Language:Towns, Building, Constru

2、ction”這本書中提出。Alexander對於樣式給出了如下的定義:每個樣式都描述了一個在我們的環境中不斷出現的問題,然後描述該問題的解決方法。透過這種模式,你可以無限數次地使用那些已有的解決方法,無需再重複相同的工作。,17-1 簡介,設計樣式 因此,所謂的樣式就是對於反覆出現的設計問題所提供的解決方法。Alexander所談論的樣式是指建築工程領域上的樣式。而近年來,同樣的思維與概念也逐漸地在軟體工程的研究以及實作領域中受到相當的重視 在軟體設計上,對於設計樣式的研究首推由Gamma等四位物件導向技術大師所著之”Design Pattern:Elements of Reusable Ob

3、ject-Oriented Software”這本書。這本書中主要記載著23種不同的設計樣式,並且將這些設計樣式分為三大類:建構樣式(creational pattern)、結構樣式(structural pattern)、以及行為樣式(behavioral pattern)。,17-2 建構樣式,當物件的建構依賴於某些決策時,建構樣式提供我們如何建構物件的方針。建構樣式包含有下列幾個: Abstract Factory Builder Factory Method Prototype Singleton,17-2 建構樣式,工廠方法 宣告一個建構產品(product)物件的工廠介面(inte

4、rface或是抽象類別),將產品物件的實際建構工作留給工廠角色的子類別。 UML表法:,17-2 建構樣式,工廠方法 範例說明 假設我們正在設計一個有關繪圖的軟體。這個軟體目前所處理的形狀(Shape)包括有圓形以及長方形這兩個物件。 由上面的敘述,我們知道程式中會處理到兩個物件,一個是圓(circle),另一個是長方形(rectangle)。我們可以將它們視為產品(product)。並且對於每一個產品我們可以設計一個對應的工廠。UML的設計模型如下所示:,17-2 建構樣式,工廠方法 範例說明當我們需要用到圓型時,我們就叫圓型工廠幫我們製造它。當我們需要生成橢圓形時,我們就請橢圓型工廠幫我們

5、製造它。,17-2 建構樣式,客戶端 下面所列為客戶端(client)的程式。由程式碼中我們可以清楚地看到,實際的產品建構工作是由特定的具體工廠子類別來負責。具體工廠的父類別只負責宣告了一個抽象的工廠方法 createProduct()來讓客戶端呼叫。客戶端並不需要知道產品是如何被建構出來的,因為那是工廠的責任。這就好比如說一家賣家電用品的零售商,當他的貨品短缺時,他只需要告訴製造貨品的工廠送貨較好了。至於貨品是如何製造的,並不是他所應該關心的。,17-2 建構樣式,客戶端 程式碼範例,01 public class Main 02 public static void main(String

6、 args) 03 Factory a = new CircleFactory(); 04 Shape s1 = a.createProduct(); /工廠方法 05 s1.draw(); 06 System.out.println(); 07 Factory b = new RectangleFactory(); 08 Shape s2 = b.createProduct(); /工廠方法 09 s2.draw(); 10 11 ,17-2 建構樣式,開閉原則 值得一提的是,如果今天我們必須增加新的產品時,我們只需要設計一個新的具體產品,以及一個具體的工廠來生產它即可。這樣就可以不用更改既

7、有的設計,並且擴充了既有程式的功能。因此,工廠方法基本上滿足了開閉原則(OCP)。,17-3 行為樣式,行為樣式探討物件之間的演算法以及責任分配的問題。行為樣式包含有下列幾個: Chain of Responsibility Command Interpreter Iterator Mediator Memento,Observer State Strategy Template Method Visitor,17-3 行為樣式,樣版方法 對於一個演算法來說,其中的某些部份可能定義很明確,所以,我們可以在父類別中實作。而其他不明確的部份可能有許多不同的實作方式。所以,將不明確的部份留給子類別來

8、實作。 UML表法:,17-3 行為樣式,責任 由上面類別圖所表示的靜態結構可以看出此樣式中,父類別實作了templateMethod()。這個方法templateMethod()就是所謂的樣板方法。在這個樣板方法定義了流程的處理步驟(圖中所示的primitiveMethod()等等),真正實作這些步驟則是子類別的責任。,17-3 行為樣式,可維護性 從另外一個觀點來看Template Method。在你的設計中,它可能包含了許多的類別從事類似的工作或是流程。那麼,為了避免程式碼的重複所造成的維護困難,你應該將相同的部分從各類別中分離出來放到父類別裡頭。這樣一來,這一部份就不會重複出現在子類別

9、中。這樣設計的益處是提供程式碼的可維護性。,17-3 行為樣式,範例 就我們上面所談到的繪圖軟體來說,假設圓或是長方形這兩個物件均實作了一個draw()的方法,所以當它們收到draw訊息時,便會繪製它們自己。 個別的程式碼如下:,01 public abstract class Shape 02 public abstract draw(); 03 04 public class Circle 05 public void draw() 06 Graphics g = getGraphics(); 07 Color c = getColor(); 08 drawCircle(g, c); 09

10、 g.dispose(); 10 ,17-3 行為樣式,範例 個別的程式碼如下,11 12 public class Rentangle 13 public void draw() 14 Graphics g = getGraphics(); 15 Color c = getColor(); 16 drawRectangle(g, c); 17 g.dispose(); 18 19 ,17-3 行為樣式,範例 上面程式碼的UML類別圖表示如下:,17-3 行為樣式,範例 refactoring 從上面的程式碼,我們可以很清楚地發覺到在這兩個不同物件中的draw()方法幾乎很類似。不同的地方只有

11、在drawCircle()以及drawRectangle()。因此,我們可以在父類別(Shape)中實作設計一個樣板方法,就叫做draw(),然後宣告一個抽象的方法drawShape(),讓Shape的子類別去實作它。因為如何繪製一個特定的形狀是無法由父類別得知,只有特定的子類別才知道。利用這樣的設計,我們的程式碼將被修改如下:,17-3 行為樣式,範例 Refactoring,01 public abstract class Shape 02 public abstract drawShape(); 03 public void draw() 04 Graphics g = getGraph

12、ics(); 05 Color c = getColor(); 06 drawShape(g, c); 07 g.dispose(); 08 09 10 public class Circle 11 public void drawShape() 12 drawCircle(g, c); 13 14 15 public class Rentangle 16 public void drawShape() ,17-3 行為樣式,範例 Refactoring轉換成類別圖,我們就可以很清楚地看出樣板方法的結構了。,17 drawRectangle(g, c); 18 19 ,17-4 結構樣式,結構

13、樣式探討不同型態的物件或是類別如何組織起來一起工作的問題。結構樣式包含有下列幾個: Adapter Bridge Composite Decorator Faade Flyweight Proxy,17-4 結構樣式,Decorator(裝飾) 動態地增加物件的責任,提供一種不需利用子類別也可以擴充功能的方式。 UML表法:,17-4 結構樣式,Decorator(裝飾) 例子 假設說我們希望對於程式中所用到的JLabel物件加上邊框(JLabel是Java Swing中的一個圖形元件)。那麼,最簡單的作法是利用繼承的機制從JLabel衍生出子類別。這個子類別是用來裝飾JLabel用的。利用它

14、,我們可以在繪製JLabel時加上我們所需要的畫邊框功能。,public class JBorderLabel extends JLabel / protected void paintComponent(Graphics g) super.paintComponent(g);int height = this.getHeight();int width = this.getWidth();g.drawRect(0, 0, width - 1, height - 1); ,17-4 結構樣式,Decorator(裝飾) 例子 上面灰階所涵蓋的的部分表示用來裝飾JLabel邊框的程式碼。我們首先

15、叫用父類別的paintComponent()方法來將JLabel畫出,之後,取得這個Label的尺寸大小,然後在其外圍的邊界畫上一個長方形來達成我們想要的視覺效果。,17-4 結構樣式,Decorator(裝飾) 如果JLabel可以這麼做,那麼其他的Swing圖形元件是否也可以如法泡製以製造出邊框的效果呢?答案是肯定的。我們確實可以利用上述之衍生子類別的方式來設計出所有的圖形元件均有邊框的效果。可是這會造成一個問題。問題在於當你使用太多的衍生子類別來達成裝飾的目的時,將會使得程式碼的維護困難度增高。程式碼的維護困難度增高將會導致程式碼較容易出錯。另外值得注意的一點是採用繼承的方式來實作Dec

16、orator並不是具有彈性的作法。你無法控制什麼時候要在JLabel加上邊框,什麼時候不需要加邊框。,17-4 結構樣式,Decorator(裝飾) 從Decorator樣式的設計動機,我們所希望的裝飾方式是動態的。也就是,當我們需要增加額外的功能時,我們可以利用裝飾的方式來提供,如果沒有這個需求時,原來的物件還是原來的物件。因此,仿照Decorator的結構,我們可以如下設計:,17-4 結構樣式,Decorator(裝飾) 這樣一來,當某一個JLabel物件需要裝飾邊框時,你只需要利用下面的方式即可。,JLabelBorderDecorator dlabel = new JLabelBorderDecorator(new JLabel(“Test“);,Q&A討論時間,本章結束,

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1