Observer Pattern

Một phần của tài liệu tài liệu design patterns (Trang 41 - 51)

6. Nhóm các mẫu tương tác động (Behavioral Patterns)

6.1 Observer Pattern

a. Mục đích ý nghĩa

Observer là một mẫu thiết kế được dùng trong trường hợp ta muốn tạo ra mối quan hệ phụ thuộc một nhiều, những lớp đối tượng phụ thuộc vào đối tượng khác, gọi là các đối tượng quan sát (observer) và đối tượng được quan sát (observable). Khi trạng thái của đối tượng được quan sát thay đổi thì những đối tượng quan sát sẽ được thông báo và thực hiện hành động nào đó.

b. Cấu trúc

Mô tả

*Đầu tiên Observer sẽ đăng ký với Subject, Subject lưu lại trạng thông tin về observer đã đăng ký

*Khi trạng thái của Subject bị thay đổi, nó sẽ thông báo với tất cả các observer đã đăng ký với nó.

*Observer nếu không muốn có thể bỏ đăng ký bất cứ lúc nào khi đó khi trạng thái Subject thay đổi,

Observer sẽ không nhận được thông báo về sự thay đổi đó nữa. *Một Observer khác có thể đăng ký với Subject lúc bất cứ lúc nào. c.Ví dụ:

Đối tượng subject trong ví dụ này là một form chính, đối tượng observer là các form phụ, khi người dùng chọn màu từ form chính, các form phụ sẽ nhận được màu đã chọn và màu nền của các form phụ này sẽ được thay đổi với màu tương ứng.

//interface observer interface IObserver {

void Update(ASubject subject); }

//abstract subject class abstract class ASubject {

//chua color

private string color;

public string Color {

set {

if(color!=value) color = value; Notify();

}

get { return color; } }

//collection de chua cac child form

private List<IObserver> list = new List<IObserver>(); public ASubject(string color)

{

this.color = color; }

public void attach(IObserver observer) {

list.Add(observer); }

public void dettach(IObserver observer) {

list.Remove(observer); }

public void Notify() {

foreach (IObserver item in list) {

item.Update(this); }

//concrete subject class

class ConcreteClass:ASubject {

private string color=string.Empty;

public ConcreteClass(string color):base(color) {

} }

//crete observer class

class ConcreteObserver:System.Windows.Forms.Form,IObserver {

public void Update(ASubject subject) {

switch(subject.Color) {

case "Red" : this.BackColor = Color.Red; break;

case "Blue": this.BackColor = Color.Blue; break;

default: this.BackColor = Color.Yellow; break; } } } 6.2 Iterator Pattern a. Mục đích, ý nghĩa

Một đối tượng tập hợp nhưlà một danh sách cũng cung cấp cho ta các phương thức truy cập các thành phần của nó. Tuy nhiên đôi lúc chúng ta cần duyệt các thành phần của danh sách theo những cách thức và tiêu chí khác nhau. Chúng ta không nên làm phồng giao diện của danh sách List với các phương thức cho các cách thức duyệt. Mẫu Iterator cho phép chúng ta duyệt danh sách dễdàng bằng cách tách rời chức năng truy cập và duyệt ra khỏi danh sách và đặt vào đối tượng iterator. Lớp Iterator sẽ định nghĩa một giao diện đểtruy cập các thành phần của danh sách, đồng thời quản lý

b. Cấu trúc

Iterator (AbstractIterator)

Định nghĩa một giao diện cho việctruy cập và duyệt các phần tử ConcreteIterator (Iterator)

Cài đặt giao diện Iterator

Giữ dấu vết của vịtrí hiện tại trong tập duyệt Aggregate (AbstractCollection)

Định nghĩa một giao diện đểtạo một đối tượng Iterator ConcreteAggregate (Collection)

Cài đặt giao diện tạo Iterator đểtrảvềmột thểnghiệm đúng của ConcreteIterator. c. Ví dụ using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace IteratorRealWorld

{

///<summary>

/// Iterator Design Pattern ///</summary>

class Program {

static void Main(string[] args) {

//Build a collection

Collection collection = new Collection(); collection[0] = new Item("Item 0"); collection[1] = new Item("Item 1"); collection[2] = new Item("Item 2"); collection[3] = new Item("Item 3"); collection[4] = new Item("Item 4"); collection[5] = new Item("Item 5"); collection[6] = new Item("Item 6"); collection[7] = new Item("Item 7"); collection[8] = new Item("Item 8"); // Create iterator

Iterator iterator = new Iterator(collection); // Skip every other item

iterator.Step = 2;

Console.WriteLine("Iterating over collection:");

for (Item item = iterator.First(); !iterator.IsDone; item = iterator.Next()) {

Console.WriteLine(item.Name); }

} ///<summary> /// A collection class ///</summary> class Item {

private string _name; public string Name {

get { return _name; } set { _name = value; } }

public Item(string name) {

_name = name; }

}

///<summary>

/// The 'Aggregate' interface ///</summary> interface IAbstractCollection { Iterator CreateIterator(); } ///<summary>

/// The 'ConcreteAggregate' class ///</summary>

{

private ArrayList _items = new ArrayList(); public Iterator CreateIterator()

{

return new Iterator(this); }

public int Count {

get { return _items.Count; } }

public object this[int index] {

get { return _items[index]; } set { _items.Add(value); } }

}

///<summary>

/// The 'Iterator' interface ///</summary>

interface IAbstractIterator {

Item First(); Item Next();

bool IsDone { get; } Item CurrentItem { get; } }

///<summary>

/// The 'ConcreteIterator' class ///</summary>

class Iterator : IAbstractIterator {

private Collection _collection; private int _current = 0;

private int _step = 1; public int Step {

get { return _step; } set { _step = value; } }

public Item CurrentItem {

get { return _collection[_current] as Item; } }

public bool IsDone {

get { return _current >= _collection.Count; } }

// Constructor

public Iterator(Collection collection) {

_collection = collection; }

public Item First() {

_current = 0;

return _collection[_current] as Item; }

public Item Next() {

_current += _step; if (!IsDone) {

return _collection[_current] as Item; } else { return null; } } } } 7. Kết luận

Trong khuôn khổ đề tài mới tìm hiểu được những mẫu thiết kế thông dụng nhất. Việc hiểu để vận dụng các mẫu thiết kế là yêu cầu bắt buộc đối với kỹ sư phần mềm để có được các phần mềm có chất lượng tốt. Hy vọng rằng đây sẽ là tài liệu tham khảo hữu ích cho sinh viên ngành công nghệ phần mềm.

Tài liệu tham khảo

[1] Design Patterns: Elements of Reusable Object-Oriented Software Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

[2] Introduction to Design Patterns in C#, James W. Cooper [3] C# 3.0 Design Patterns, Judith Bishop

Một phần của tài liệu tài liệu design patterns (Trang 41 - 51)