跳到主要內容

[筆記] Head First Design Patterns

Chapter 1 Welcome to Design Patterns: an introduction

OO Basics:
  • Abstraction
  • Encapsulation
  • Polymorphism
  • Inheritance
OO Principles:
  • Encapsulate what varies.
  • Favor composition over inheritence.
  • Program to interfaces, not implementations.
OO Patterns:
  • Strategy - defined a family of algorithms, encapsulates each once, and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.

Chapter 2 Keeping your Objects in the know: the Observer Pattern

OO Principles:
  • Strive for loosely coupled designs between objects that interact.
OO Patterns:
  • Observer - defines a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.

Chapter 3 Decorating Objects: the Decorator Pattern

OO Principles:
  • Classes should be open for extension but closed for modification.
OO Patterns:
  • Decorator - Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.

Chapter 4 Baking with OO Goodness: the factory Pattern

OO Principles:
  • Depend on abstractions. Do not depend on concrete classes.
OO Patterns:
  • Abstract Factory - Provide an interface for creating families of related or dependent objects without specifying their concrete classes.
  • Factory Method - Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to the subclasses.

Chapter 5 One of a Kind Objects: the Singleton Pattern

OO Patterns:
  • Singleton - Ensure a class only has one instance and provide a global point of access to it.

Chapter 6 Encapsulating Invocation: the Command Pattern

OO Patterns:
  • Command - Encapsulates a request as an object, thereby letting you parameterize other objects with different requests, queue or log requests, and support undoable operations.
When you need to decouple an object making requests from the objects that know how to perform the requests, use the Command Pattern.

Chapter 7 Being Adaptive: the Adapter and Facade Patterns

OO Principles:
  • Only talk to your fiends
OO Patterns:
  • Adapter - Converts the interface of a class into another interface clients expect. Lets classes work together that couldn't otherwise because of incompatible interfaces.
  • Facade - Provides a unified interface to a set of interfaces in a subsystem. Facade defined a higher-level interface that makes the subsystem easier to use.

Chapter 8 Encapsulating Alogrithms: the Template Method Pattern

OO Principles:
  • Don't call us, we'll call you.
OO Patterns:
  • Template Method - Defined the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.

Chapter 9 Well-Managed Collections: the Iterator and Composite Patterns

OO Patterns:
  • Iterator - Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
  • Composite - Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.

Chapter 10 The State of Things: the State Pattern

OO Pattern:
  • State - Allows an object to alter its behavior when its internal state changes. The object will appear to change it class.

Chapter 11 Controlling Object Access: the Proxy Pattern

OO Pattern:

  • Proxy - Provide a surrogate or placeholder for another object to control access to it.

Chapter 12 Patterns of Patterns: Compound Patterns

OO Pattern:

  • Compound Patterns - A Compound Pattern combines two or more patterns into a solution that solves a recurring or general problem.

Chapter 13 Patterns in the Real World: Better Living with Patterns


Chapter 14 Appendix: Leftover Patterns

OO Patterns:
  • Bridge - Use the Bridge Pattern to vary not only your implementations, but also your abstractions.
  • Builder - Use the Builder Pattern to encapsulate the construction of a product and allow it to be constructed in steps.
  • Chain of Responsibility - Use the Chain of Responsibility Pattern when you want to give more than one object a chance to handle a request.
  • Flyweight - Use the Flyweight Pattern when one instance of a class can be used to provide many "virtual instances."
  • Interpreter - Use the Interpreter Pattern to build an interpreter for a language.
  • Mediator - Use the Mediator Pattern to centralize complex communications and control between related objects.
  • Memento - Use the Memento Pattern when you need to be able to return an object to one of its previous states; for instance, if your use requests an "undo."
  • Prototype - Use the Prototype Pattern when creating an instance of a given class is either expensive or complicated.
  • Visitor - Use the Visitor Pattern when you want to add capabilities to a composite of objects and encapsulation is not important.

留言

這個網誌中的熱門文章

用 C# 批次控制 Word 合併列印

前由 我有全區的電話資料,問題在於我要依不同里別來製作出電話簿。結果如下圖: 單純採用合併列印無法達成我的需求。解決方法係用「功能變數」儲存上一個里別,與現在里別進行比較:若不同,則換頁。不過,這樣功能變數還蠻長的。最後,我還是採用 C# 來解決。 解決方案 用 C# 控制 WORD 中合併列印的「資料來源 Data Source」,給予不同里別的「sqlstatement」。迴圈處理不同的里別即可。但可預見其處理過程會很慢,不過還好,我可以不用在意它,有跑出結果即可。 程式碼 IList<string> areas = new List<string>() { "後壁", "侯伯", "嘉苳", "土溝", "嘉田", "嘉民", "菁豊", "崁頂", "後廍", "墨林", "菁寮", "新嘉", "頂長", "平安", "仕安", "竹新", "新東", "長安", "頂安", "福安", "烏樹" }; string root = @"D:\"; // 根目錄 string data = root + @"\data.docm"; // 資料檔(即資料來源) string template = root + @"\template.docx"; // 已設定好格式與合併欄位的 Word 檔 string output = @"d:\Final"; // 輸出之資料夾 object oMissing = System.Reflection.Missing.Va...

VLC c# 順利編譯

原文網址: http://www.cnblogs.com/haibindev/archive/2011/12/21/2296173.html 原文作者: haibindev 原文標題:c#万能视频播放器 本文的重點在於修正 class VlcPlayer,使其能順利在 VC# Express 2010 .Net Framework 4 下順利編譯。 修正重點在於 CallingConvention = CallingConvention. StdCall 改成 CallingConvention = CallingConvention. Cdecl using System; using System.Runtime.InteropServices; using System.Security; using System.Text; namespace VlcDotNet { class VlcPlayer { private IntPtr libvlc_instance_; private IntPtr libvlc_media_player_; private double duration_; public VlcPlayer(string pluginPath) { string plugin_arg = "--plugin-path=" + pluginPath; string[] arguments = { "-I", "dummy", "--ignore-config", "--no-video-title", plugin_arg }; libvlc_instance_ = LibVlcAPI.libvlc_new(arguments); libvlc_media_player_ = LibVlcAPI.libvlc_media_player_new(libvlc_instance_); } public ...

[Symfony+Doctrine] 透過非 Id 來使用 Pessimistic Lock

根據 文件 ,Doctrine 有 Pessimistic Lock,又分為兩種: LockMode::PESSIMISTIC_WRITE:對應至 MySQL 的 Select FOR UPDATE LockMode::PESSIMISTIC_READ:對應至 MySQL 的 Select LOCK IN SHARE MODE 差別在於 LOCK IN SHARE MODE 會將在 row 的資料鎖定(row-level lock),在非同一交易(Transaction)下,不給寫入,其他交易可以讀取, 且可以繼續 Select LOCK IN SHARE MODE 。而 FOR UPDATE 不僅鎖定該資料,在非同一交易下,不給寫入,其它交易可以讀取, 但不能 Select LOCK IN SHARE MODE 。MySQL 文件有更詳細的比較與情境使用的說明,參考 網址 。 現在問題是,我們要完全採用 ORM 來處理資料。Doctrine 的文件提到 EntityManager::find 可以採用 Pessimistic Lock, 但 find 是透過 id 來處理 。而其他 find 系列函數(包括:findAll, findBy, findOneBy)皆不支援 LockMode。 因此,勢必要有方法來「透過非 id 來使用 Pessimistic Lock」。透過查看原始碼,簡單的方法是有的,解法之範例如下: 19 public function depositAction() 20 { 21 22 $em = $this->getDoctrine()->getManager(); 23 24 $em->transactional(function ($em) { 25 $entityName = 'AcmeTrainingBundle:Account'; 26 $lockMode = LockMode::PESSIMISTIC_READ; 27 $orderBy = null; 28 $...