C ươ g 8: ẫu thiết ế (pattern) Chương 8 Mẫu t ết kế (patte

)

UML/NN

1

Phần mềm tốt?
Theo kiến trúc Comodity (Tiện nghi) Firmness (Tính ổn định) ( ị ) Delight (Tính mỹ quan)

UML/NN

2

Khó khăn của thiết kế phần mềm
Độ phức tạp Tính bất qui tắc Phần mềm có thể thay đổi và luôn luôn thay y y đổi Phần mềm không nhìn thấy được (invisible)

UML/NN

3

Nguyên lý thiết kế lớp
Nguyên lý đóng mở: mở với phát triển thêm nhưng đóng với việc sửa code Nguyên lý thay thế Liskov: Các lớp cơ sở có thể thay thế bằng lớp con kế thừa Nguyên lý nghịch đảo phụ thuộc: Phụ thuộc vào trừu tương không phụ thuộc vào chi tiết (kiến trúc phân tầng quá nhiều sẽ bất lợi) Nguyên lý ISP (The Inteface Segregation Principle): Nên tách giao diện (vd có chức năng chung) dùng chung thành nhiều đặc thù
UML/NN 4

Mẫu thiết kế (Design Pattern)
Người thiết kế tốt có khả năng nhận ra những mẫu giải quyết vấn đề và những mẫu tương ứng để giải quyết vấn đề Những đặc trưng (lớp, nhiệm vụ, cộng tác), các (lớp vụ tác) thuộc tính của thiết kế mà có thể điều chỉnh để cho p ép ẫu t ết ế g ả phép mẫu thiết kế giải quyết các vấn đề ấ

5

CNPM/NN

Pattern…
Tên mẫu (Pattern name) - describes the essence of the pattern in a short but expressive name Mục đích (Intent) - describes the pattern and what it does Tên khác (Also-known-as) - lists any synonyms for the pattern Sự thúc đẩy (Motivation) - provides an example of the problem Khả năng vận dụng ( pp g ậ ụ g (Applicability) - notes specific y) p design situations in which the pattern is applicable

6

CNPM/NN

…Pattern
Cấu trúc (Structure) - describes the classes that are required to implement the pattern q p p Lớp tham gia (Participants) - describes the responsibilities of the classes that are required to implement the pattern Cộng tác (Collaborations) - describes how the participants collaborate to carry out their responsibilities Hệ quả (C ả (Consequences) - d ) describes the “d i forces” ib h “design f ” that affect the pattern and the potential trade-offs that must be considered when the pattern is implemented (đặt cho bạn á l b các lựa chọn) h ) Mẫu liên quan (Related patterns) - cross-references g p related design patterns
7 CNPM/NN

Các mẫu thiết kế
Creational Pattern (Mẫu kiến tạo):
Abstractional Factory Method Pattern Builder pattern Factory Method pattern Prototype Pattern Singleton Pattern…

S uc u e a e Structure Pattern: (có mẫu Composite, ẫu Co pos e, Adaptor) Behavioral Pattern: (có mẫu Observer)
8 CNPM/NN

Mẫu thiết kế Singleton
Cho phép có một thể hiện của lớp. Vd: Find Dialog, Unikey, một đối tượng t à cục lư Di l U ik ột tượ toàn lưu giữ kết nối CSDL…

UML/NN

9

Singleton (kiến tạo)
Singleton
static uniqueInstance singletonData static Instance() SingletonOp() GetSingletonData() return uniqueinstance i i

CS 406: 10 Design Patterns

Singleton Code
Using system; Class Singleston { private static Singleston instance; Protect Singlestone() {} public static SingleStone Instance() { if (instance==null) instance = new SingleStone (); return SingleStone; } }
UML/NN 11

ADAPTER (structure)
Tái sử dụng các lớp nhưng giao diện (interface) không tươ thích khô tương thí h Có những vấn đề không tương thích tiềm tàng

4/16/2010

MF12 F21AS

Adapter
Có 2 mẫu:
Mẫu cấu trúc Class ẫ Mẫu Cấu trúc Object

4/16/2010

MF13 F21AS

Adapter1
Client Target Adaptee specificRequest() ifi R t()

request() t()

Adapter request()

Đa thừa kế

4/16/2010

MF14 F21AS

Adapter2
Client <<interface>> Target request() Adapter request() Adaptee specificRequest()

4/16/2010

MF15 F21AS

Adapter example
class PayProcessor { .... //this method expects a WeeklyEmployee object public static void printPay(WeeklyEmployee e) bli t ti id i tP (W kl E l ) { System.out.println(e.getName() + “ is paid “ + e.getPay() ; } }
PayProcessor printPay(WeeklyEmp loyee e)
4/16/2010

WeeklyEmployee getName() getPay()
MF16 F21AS

Example

client

PayProcessor printPay(WeeklyEmp loyee e)

adaptee

?

target

WeeklyEmployee getName() getPay()

MonthlyEmployee getEmployeeName() getMonthlySalary()

4/16/2010

MF17 F21AS

Biểu đồ lớp
Client - unaltered
Pay Processor printPay (Weekly (W kl Employee e) WeeklyEmployee getPay() getName() MonthlyAdapter MonthlyEmployee : me getPay() getName() MonthlyEmployee getMonthlyPay() getEmployeeName()

Target -unaltered.

Adaptor Contains an adaptee object Provides own implementation of target’s methods – which call adaptee’s methods

Adaptee unaltered

4/16/2010

MF18 F21AS

MonthlyAdapter
public class MonthlyAdapter extends WeeklyEmployee { private MonthlyEmployee me; //composed with adaptee //created with adaptee object // t d ith d t bj t public MonthlyAdapter(MonthlyEmployee memp) { me = memp; } //own implementation of target method, //adapting to use adaptee’s instead public String getName() { return me.getEmployeeName(); } public int getPay() { return me getMonthlySalary(); } me.getMonthlySalary(); }
4/16/2010 MF19 F21AS

Test
class Test { p public static void main(String arg[]) ( g g[]) { WeeklyEmployee we = new WeeklyEmployee ( y p y (“tim”, 150); , ); PayProcessor.printPay(we); MonthlyEmployee me = new MonthlyEmployee(“jane”, 200); MonthlyAdapter ma = new MonthlyAdapter (me); PayProcessor.printPay(ma); PayProcessor printPay(ma); } }

4/16/2010

MF20 F21AS

Mẫu thiết kế Observer (hành vi)
Bài toán thực tế: Một đối tượng thời gian để đếm iờ đượ đế giờ được thể hiện dưới nhiều hình thức hiệ hiề hì h thứ như đồng hồ số, đồng hồ kim… Ta có thể
Dễ dàng thêm, bớt nhiều đối tượng thể hiện ễ ể Khi tay đổi đối tượng thời gian thì tất cả các thể hiện ủ hờ h ệ của thời gian đều thay đổ theo đề h đổi h

21

CNPM/NN

Observer
Intent: Phụ thuộc một nhiều khi một đối tượng biến đổi trạng thái các đối tượng khác phụ thuộc sẽ được biến đổi tự động Motivation: Cần duy trì sự toàn vẹn giữa các đối tượng có liên quan Applicability:
Khi có 2 hướng một cái phụ thuộc vào một cái khác Khi một biến đổi tới một đối tượng đòi hỏi biến đổi những ộ ộ ợ g g đối tượng khác mà không biết bao nhiêu đối tượng cần biến đổi Khi một đối tượng phải có khả năng thô bá tới đối ột tượ hải ó ă thông báo tượng khác mà không cần biết rõ chúng
22 CNPM/NN

Mô hình Observer
Relative Percentages

A B C D X Y Z 15 35 35 15 10 40 30 20 C 10 40 30 20 A B C D D

A B

Change notification Requests, modifications

A=10% B=40% C=30% D=20% D 20%

Application data

CS 406: 23 Design Patterns

Observer-- Structure
Subject Observer

*
Attach(Observer) Detach(Observer) D t h(Ob ) Notify() Update()

ConcreteSubject subjectState GetState() SetState()

ConcreteObserver observerState

Update()

24

CNPM/NN

Observer– Sequence Diagram
aConcreteSubject: ConcreteSubject aConcreteObserver: ConcreteObserver
SetState()

anotherConcreteObserver: ConcreteObserver

Notify() Update() GetState() Update() GetState()

25

CNPM/NN

Observer-- Example
Subject Observer

*
Attach(Observer) Detach(Observer) D t h(Ob ) Notify() Update()

ClockTimer

DigitalClock ClockTimer *sub; Update() Draw()

AnalogClock ClockTimer *sub; Update() Draw()

26

CNPM/NN

Observer Example – Sample Code
class Subject; class Observer { public: virtual ~Observer(); virtual void Update(Subject * theChngedSub) = 0; protected: t t d Observer(); } class Subject { public: virtual ~Subject(); virtual void Attach(Observer *); ( ); virtual void Detach(Observer *); virtual void Notify(); protected: List <Observer*> *_observers; <Observer > observers; };
27 CNPM/NN

…Observer Example…
void Subject :: Attach(Observer* o) { _observers >Append(o); observers-->Append(o); } void Subject :: Detach(Observer* o) { j ( ) _observers-->Remove(o); } void Subject :: Notify() { ListIterator<Observer*> i (_observers); for (i.First(); !i.IsDone(); i.Next()) { i.CurrentItem()->Update(this); iC tIt () >U d t (thi ) } }

28

CNPM/NN

…Observer Example…
class ClockTimer : public Subject { public: ClockTimer(); virtual int GetHour(); virtual int GetMinute(); virtual int GetSecond(); void Tick();

}

void ClockTimer :: Tick() { // update internal time-keeping state //… Notify(); y(); }

29

CNPM/NN

…Observer Example…
class DigitalClock : public Widget, public Observer { public: DigitalClock(ClockTimer *); ); virtual ~DigitalClock(); virtual void Update(Subject *); virtual void Draw(); i t l id D () private: ClockTimer* _subject;

}

DigitalClock :: DigitalClock(ClockTimer *s) { _subject = s; _ _subject->Attach(this); j ( ); } DigitalClock :: ~DigitalClock(ClockTimer *s) { _subject->Detach(this); }

30

CNPM/NN

…Observer Example
void DigitalClock :: Update(Subject *theChngedSub) { if (theChngedSub == _subject){ Draw(); } } void DigitalClock :: Draw() { // get the new values from the subject int hour = _subject->GetHour(); int minute = _subject->GetMinute(); // … //draw the digital clock }
// main

ClockTimer *timer = new ClockTimer; AnalogClock * analogClock = new AnalogClock(timer); DigitalClock * digitalClock = new DigitalClcok(timer); g g g ( );

31

CNPM/NN

Observer C# (tham khao file project)
using System; using System.Collections; public class Subject { private ArrayList _observer; public Subject() { _observer = new ArrayList(); } public void Attach(Observer o) { _observer.Add(o); } public void Detach(Observer o) { _observer.Add(o); } public void Notify() { for (int i = 0; i < _observer.Count; i++) { (( ((Observer)_observer[i]).Update(this); )_ [ ]) p ( ); } } }

UML/NN

32

Mẫu thiết kế Composite (kiến trúc)
Bài toán thực tế: Một máy có các chi tiết máy, các chi tiết máy có thể gồm các chi tiết á á hi á ó ồ á hi máy đơn giản (chi tiết máy đơn) và có thể có nhưng chi tiết máy ( hi tiết máy phức) mà hư hi á (chi á hứ ) à gồm có những chi tiết máy đơn và các chi tiết máy phức khác á hứ khá
Giải quyết bài toán tính giá trị của các chi tiết: giá trị máy bằng giá trị của các chi tiết máy đơn iá t ị á bằ iá t ị ủ á hi á đơ và giá trị của chi tiết máy phức (bằng tất cả giá trị của các chi tiết)
33 CNPM/NN

Composite
Intent (mục đích): Compose objects into tree structures to represent part-whole hierarchies. Let clients treat individual p pa o a a d dua objects and compositions of objects uniformly Motivation (sự thúc đẩy): components can be grouped to form larger components
aPicture

aPicture

aLIne

aRectangle

aText

aLine

aRectangle

34

CNPM/NN

Ví dụ 1
Graphic

*

Draw() Add(Graphic) Remove(Graphic) GetChild(int)

Picture Line Rectangle Text Draw() Add(Graphic) Draw() Draw() Remove(Graphic) GetChild(int)

Draw()

35

CNPM/NN

Ví dụ 2
Component

*

Operation() Add(Component) Remove(Component) GetChild(int)

Composite Leaf Operation() Add(Component) Remove(Component) GetChild(int)

Operation()

36

CNPM/NN

Cộng tác
Client tương tác với các đối tượng trong cấu trúc kết hợp qua interface lớp kết hợp Nếu đối tượng nhận là lá thì xử lý trực tiếp ợ g ậ ý ự p Nếu đối tượng nhận là một nốt kết hợp thì chuyển yêu cầu tới thành phần con của nó

37

CNPM/NN

Ví dụ khác
Equipment

*

Card

FloppyDisk

CompositeEquipment

Cabinet

Chasis

Bus

38

CNPM/NN

Sign up to vote on this title
UsefulNot useful