kapitola prochází sedm problémů, které je třeba řešit, aby bylo možné správně navrhnout Lexi, včetně všech omezení, které musí být dodržovány. Každý problém je analyzován do hloubky a jsou navržena řešení., Každé řešení je vysvětleno v plném rozsahu, včetně pseudo-kódu a případně mírně upravené verze techniky modelování objektů.
nakonec je každé řešení spojeno přímo s jedním nebo více designovými vzory. Ukazuje se, jak je řešení přímou implementací tohoto návrhového vzoru.
Na sedm problémy (včetně jejich omezení) a jejich řešení (včetně vzoru(s) odkazuje), jsou následující:
Dokument StructureEdit
dokument je „uspořádání základní grafické prvky“, jako jsou znaky, linky, jiné tvary, atd.,, že „zachytit celkový informační obsah dokumentu“(PP. 35). Struktura dokumentu obsahuje sbírku těchto prvků a každý prvek může být zase podstrukturou jiných prvků.
Problémů a Omezení
- Text a grafika by mělo být zacházeno stejným způsobem (to znamená, že grafiky nejsou odvozené instance textu, ani naopak)
- implementace by měla léčit složité a jednoduché struktury stejným způsobem. Nemělo by znát rozdíl mezi těmito dvěma.,
- specifické deriváty abstraktních prvků by měly mít specializované analytické prvky.
řešení a Vzor
rekurzivní kompozice je hierarchická struktura prvků, která staví „stále složitější prvky z jednodušších“ (PP. 36). Každý uzel ve struktuře zná své vlastní děti a svého rodiče. Pokud má být operace provedena na celé struktuře, každý uzel volá operaci na svých dětech (rekurzivně).
jedná se o implementaci kompozitního vzoru, což je sbírka uzlů., Uzel je abstraktní základní třída, a deriváty mohou být buď listy (singulární), nebo sbírky ostatní uzly (což může obsahovat listy nebo kolekce uzlů). Když je operace provedena na nadřazeném, je tato operace rekurzivně předána hierarchii.
formátování FormattingEdit
se liší od struktury. Formátování je metoda vytváření konkrétní instance fyzické struktury dokumentu. To zahrnuje rozdělení textu na řádky, použití pomlček, nastavení šířky okrajů atd.,
problémy a omezení
- rovnováha mezi kvalitou, rychlostí a úložným prostorem
- Udržujte formátování nezávislé (odpojené) od struktury dokumentu.
řešení a Vzor
třída Kompozitoru zapouzdří algoritmus používaný k formátování kompozice. Compositor je podtřída primitivního objektu struktury dokumentu. Kompozitor má přidruženou instanci objektu kompozice., Když kompozitor spustí Compose()
, iteruje přes každý prvek přidruženého složení a přeskupí strukturu vložením objektů řádků a sloupců podle potřeby.
samotný kompozitor je abstraktní třída, která umožňuje derivátovým třídám používat různé algoritmy formátování (například dvojité rozestupy, širší okraje atd.)
strategický vzor se používá k dosažení tohoto cíle. Strategie je metoda zapouzdření více algoritmů, které mají být použity na základě měnícího se kontextu., V tomto případě by formátování mělo být odlišné v závislosti na tom, zda text, grafika, jednoduché prvky atd., jsou formátovány.
Zdobit Uživatel InterfaceEdit
schopnost měnit grafické rozhraní, které uživatel používá k interakci s dokumentem.,
Problémů a Omezení
- Vymezit stránku textu s ohraničením na editační oblasti
- posuvníky, které umožní uživateli zobrazit různé části stránky
- Uživatelské rozhraní objektů by neměl vědět o zdobení
- Vyhnout se „exploze třídy“, která by byla způsobena subclassing pro „všechny možné kombinace zdobení“ a prvky (p. 44)
Řešení a Vzor,
použití transparentní kryt umožňuje prvky, které posilují chování složení, které mají být přidány do složení., Tyto prvky, jako je Border a Scroller, jsou speciální podtřídy samotného singulárního prvku. To umožňuje, aby kompozice byla rozšířena a účinně přidávala prvky podobné stavu. Protože tyto rozšíření jsou součástí struktury, jejich potřeby Operation()
bude volána, když struktura je Operation()
se nazývá. To znamená, že klient nepotřebuje žádné speciální znalosti nebo rozhraní se strukturou, aby mohl používat zdobení.,
jedná se o vzor dekorátoru, který přidává odpovědnost k objektu bez úpravy samotného objektu.
Podpora více standardů Look-And-Feeledit
Look-and-feel odkazuje na standardy uživatelského rozhraní specifické pro platformu. Tyto standardy „definují pokyny pro to, jak se aplikace objevují a reagují na uživatele“ (s. 47).
Problémů a Omezení
- editor musí implementovat standardy různých platformách, tak, že je přenosný,
- Snadno přizpůsobit se nové a vznikající standardy
- Povolit pro run-time změna podívej-a-cítit (tj.,: No hard-coding)
- mají sadu abstraktních elementárních podtříd pro každou kategorii prvků(posuvník, tlačítka, atd.)
- mají sadu konkrétních podtříd pro každou abstraktní podtřídy, které mohou mít jiný vzhled a pocit standardu. (Posuvník s MotifScrollBar a PresentationScrollBar pro Motivem a Prezentace vypadat-a-pocit)
Řešení a Vzor,
Od objektu, vytváření různých konkrétních objektů nemůže být provedeno za běhu, objekt, proces tvorby musí být získávána., To se provádí pomocí abstraktní guiFactory, která přebírá odpovědnost za vytváření prvků uživatelského rozhraní. Abstraktní guiFactory má konkrétní implementace, jako je MotifFactory, která vytváří konkrétní prvky vhodného typu (MotifScrollBar). Tímto způsobem musí program požádat pouze o posuvník a za běhu bude mít správný konkrétní prvek.
Jedná se o abstraktní továrnu. Běžná továrna vytváří betonové předměty jednoho typu. Abstraktní továrna vytváří betonové objekty různých typů, v závislosti na konkrétní realizaci samotné továrny., Jeho schopnost soustředit se nejen na konkrétní předměty, ale na celé rodiny betonových předmětů „ji odlišuje od ostatních kreačních vzorů, které zahrnují pouze jeden druh produktového objektu“ (s. 51).
Podpora více okenních Systémůedit
stejně jako look-and-feel se liší napříč platformami, tak je způsob manipulace s windows. Každá platforma zobrazuje, stanoví, zpracovává vstup a výstup z, a vrstvy oken jinak.,
problémy a omezení
- editor dokumentů musí běžet na mnoha „důležitých a do značné míry nekompatibilních okenních systémech“, které existují (p. 52)
- nelze použít abstraktní továrnu. Vzhledem k rozdílným standardům nebude pro každý typ widgetu společná abstraktní třída.
- vytvořit novou, nestandardní okenní systém
Řešení a Vzor,
je možné vytvořit „vlastní abstraktní a konkrétní výrobek třídy“, protože „všechny okenní systémy obecně to samé“ (str. 52)., Každý okenní systém poskytuje operace pro kreslení primitivních tvarů, ikonifikaci / de-iconifying, změnu velikosti a osvěžující obsah okna.
abstraktní základna Window
třída může být odvozena od různých typů existujících oken,jako je aplikace, ikonifikovaný dialog. Tyto třídy budou obsahovat operace spojené s windows,jako je přetváření, graficky osvěžující atd. Každé okno obsahuje prvky, jejichž Draw()
funkce jsou povoláni do Window
‚s vlastní kreslení-souvisejících funkcí.,
aby nebylo nutné vytvářet podtřídy oken specifické pro platformu pro každou možnou platformu, použije se rozhraní. Window
třída bude implementovat Window
realizace (WindowImp
) abstraktní třídy. Tato třída pak bude odvozena do více implementací specifických pro platformu, z nichž každá má operace specifické pro platformu., Tedy, pouze jeden soubor Window
třídy jsou potřebné pro každý typ Window
, a pouze jednu sadu WindowImp
třídy jsou potřebné pro každou platformu (spíše než Kartézský součin všech dostupných typů a platformy). Přidání nového typu okna navíc nevyžaduje žádnou úpravu implementace platformy nebo naopak.
toto je mostový vzor. Window
a WindowImp
jsou různé, ale související., Window
nabídky s okny v programu, a WindowImp
nabídky s okny na platformě. Jeden z nich se může změnit, aniž by musel měnit druhý. Mostní vzor umožňuje těmto dvěma „odděleným hierarchiím tříd spolupracovat, i když se vyvíjejí nezávisle“ (s. 54).
Uživatel Operaceeditovat
Všechny akce může uživatel s dokumentem, od vstupu text, měnit formátování, ukončení, ukládání, atd.,
Problémů a Omezení
- Operace musí být přístupné prostřednictvím různých vstupů, jako je menu a klávesové zkratky pro stejný příkaz
- Každá varianta má rozhraní, které by měly být modifikovatelné
- Operace jsou implementovány v několika různých třídách,
- aby se zabránilo spojovací, nesmí být mnoho závislostí mezi implementace a uživatelské rozhraní tříd.,
- Zpět a znovu příkazy musí být podporován na většině dokumentu, změna operace, bez libovolné omezení na počet úrovní undo
- Funkce nejsou životaschopné, protože nemají undo/redo snadno, nejsou snadno spojena s státu, a jsou těžko k prodloužení nebo opětovné použití.nabídky
- by měly být považovány za hierarchické kompozitní struktury. Nabídka je tedy položka nabídky, která obsahuje položky nabídky, které mohou obsahovat další položky nabídky atd.,
řešení a Vzor
každá položka nabídky, spíše než instance se seznamem parametrů, se místo toho provádí příkazovým objektem.příkaz
je abstraktní objekt, který má pouze jediný abstrakt Execute()
metoda. Odvozené objekty vhodně rozšiřují metodu Execute()
(tj.PasteCommand.Execute()
by využívaly vyrovnávací paměť schránky obsahu). Tyto objekty mohou být použity widgety nebo tlačítka stejně snadno, jak mohou být použity položky nabídky.,
Na podporu undo a redo, Command
je také uveden Unexecute()
Reversible()
. V derivátových třídách, první obsahuje kód, který vrátí tento příkaz, a druhý vrátí boolean hodnotu, která definuje, zda je příkaz neproveditelný. Reversible()
umožňuje, aby některé příkazy byly neproveditelné, například příkaz Uložit.
provedeny Commands
jsou uloženy v seznamu s metodou vedení „prezentovat“ značku přímo po poslední provedený příkaz., Požadavek na vrácení bude volat Command.Unexecute()
přímo před“ přítomen „a poté přesunout“ přítomen “ zpět jeden příkaz. Naopak, Redo
žádost bude volat Command.Execute()
po „současnost“, a přesunout „dárek“ vpřed.
tentoCommand
přístup je implementací příkazového vzoru. Zapouzdřuje požadavky v objektech a používá společné rozhraní pro přístup k těmto požadavkům. Klient tak může zpracovávat různé požadavky a příkazy mohou být rozptýleny po celé aplikaci.,
Kontrola pravopisu a dělení Slovedit
toto je schopnost editoru dokumentů textově analyzovat obsah dokumentu. Ačkoli existuje mnoho analýz, které mohou být provedeny, Kontrola pravopisu a dělení-formátování jsou zaměření.
Problémů a Omezení
- Umožňují více způsobů, jak zkontrolovat pravopis a identifikovat místa pro dělení slov
- Umožňují rozšíření pro budoucí analýzu (např. počet slov, kontrola gramatiky)
- Být schopen iterovat textového obsahu bez přístupu k textu je skutečná struktura (např.,, array, linked list, string)
- umožňují jakýkoli způsob procházení dokumentu(začátek do konce, konec do začátku, abecední pořadí atd.)
řešení a Vzor
odstranění celočíselného indexu ze základního prvku umožňuje implementaci jiného iteračního rozhraní. To bude vyžadovat další metody pro procházení a vyhledávání objektů. Tyto metody jsou uvedeny do abstraktníhoIterator
rozhraní., Každý prvek pak implementuje odvození Iterator
, v závislosti na tom, jak který prvek udržuje svůj seznam (ArrayIterator
LinkListIterator
, atd.).
funkce pro procházení a vyhledávání jsou vloženy do abstraktního Iterátorového rozhraní. Budoucí Iterátory mohou být odvozeny na základě typu seznamu budou iterace, například Polí nebo spojových Seznamů. Bez ohledu na to, jaký typ metody indexování používá jakákoli implementace prvku, bude mít příslušný iterátor.
jedná se o implementaci Iterátorového vzoru., Umožňuje klientovi procházet jakoukoli sbírkou objektů, aniž by musel přistupovat k obsahu sbírky přímo, nebo se obávat typu seznamu, který struktura sbírky používá.
nyní, když byl traversal zpracován, je možné analyzovat prvky struktury. Není možné sestavit každý typ analýzy do struktury prvků; každý prvek by musel být kódován a velká část kódu by byla stejná pro podobné prvky.
místo toho je do abstraktní třídy prvku zabudována obecná metoda CheckMe()
., Každý iterátor je uveden odkaz na konkrétní algoritmus(jako je kontrola pravopisu, Kontrola gramatiky atd.). Když tento iterátor iteruje prostřednictvím své sbírky, volá každý prvek CheckMe
, procházející zadaný algoritmus. CheckMe
poté předá odkaz na svůj prvek zpět do uvedeného algoritmu pro analýzu.
Chcete-li tedy provést kontrolu pravopisu, bude iterátoru front-to-end uveden odkaz na objekt SpellCheck
., Iterátor by pak přístup k každý prvek, vykonávající jeho CheckMe()
metoda SpellCheck
parametr. Každý CheckMe
by pak zavolal SpellCheck
a předal odkaz na příslušný prvek.
tímto způsobem lze použít jakýkoli algoritmus s jakoukoli traverzální metodou, aniž by byl pevný kód spojen s druhým. Například Find lze použít jako “ najít další „nebo“ najít předchozí“, v závislosti na tom, zda byl použit iterátor“ vpřed „nebo“ zpětný “ iterátor.,
kromě toho mohou být algoritmy samy zodpovědné za řešení různých prvků. Například SpellCheck
algoritmus by ignorovat Graphic
element, spíše než mít na programu každý Graphic
odvozený prvek nebude posílat sami na SpellCheck
.