DESIGN PATTERN FRAMEWORK 4.5 PDF
All rights reserved Page 1 of 16 Design Pattern Framework™ 1. .. Documentation is available in the 'Gang of Four Design Patterns pdf' document. Page 5 of Design Pattern Framework Introduction This document describes Spark and its Art Shop reference application. Spark is a light- weight. NET features, such as, generics, attributes, delegates, reflection, and more. These and much more are available in ppti.info Design Pattern Framework
|Language:||English, Spanish, Hindi|
|ePub File Size:||28.45 MB|
|PDF File Size:||10.69 MB|
|Distribution:||Free* [*Regsitration Required]|
We recommend that you first explore the standard Design Pattern Framework It allows you to fully evaluate the Spark Platform before deciding to upgrade to. In fact, our latest Design Pattern Framework is 9 packages in one -- each filled with Printable PDF document with all GoF Patterns. 4. For more information, reference our Special Bulk Sales–eBook. Licensing web page at NET Framework SDK Documentation System.
Documentation is available towards the end of the Spark 4. All rights reserved. Database Setup All applications in this package are configured to run against a LocalDb database instance. Start by creating a new SQL Server database. Then run the relevant script named Action. This will create the database and the data. Then finally change the connection string in the relevant web. The application s are now ready to run against SQL Server.
Design patterns are advanced object-oriented techniques. It is assumed that you have experience programming in C or VB and that youre familiar with OO concepts such as classes, objects, interfaces, encapsulation, inheritance, etc.
To understand design patterns you need to know what they are and why they exist. On our website we explain patterns like so: Design patterns are solutions to software design problems you find again and again in real-world application development.
Patterns are about design and interaction of objects, as well as providing a communication platform concerning elegant, reusable solutions to commonly encountered programming challenges.
Page 7 of 16 Design Pattern Framework 4. So, they come up with the wheel pattern that will solve all problems that require the ability to easily move over the ground. Clearly, there are different types of wheels for cars, bikes, wheelbarrows, etc.
It takes time and experience before a pattern is recognized or discovered. But once it is proven and documented, other developers will benefit because they dont have to go through the same trial-and-error process. This greatly accelerates productivity of. NET developers. There is plenty of information on design patterns available in books and on the Internet wikis, forums, etc. However, these sources do not provide solid examples that show when, where, and how these patterns are used in real-world apps.
Most examples are simple and do not represent the real world. This makes it hard for. NET developers to learn about design patterns and know how to apply these in their own projects. The Design Pattern Framework 4. First, it includes structural, real-world, and. NET optimized versions of all the Gang of Four design patterns. Secondly, this release includes two full-stack reference applications: one called Patterns in Action 4.
Below are two possible starting points on your journey to learn about design patterns. Page 8 of 16 Design Pattern Framework 4.
They are called Gang of Four because they were first published in a book titled Design Patterns, written by 4 co-authors. The GoF design patterns are available in 3 forms: structural, real-world and. NET optimized. The structural form follows the original, somewhat abstract, definition with original class names.
The real-world follows the same structure, but is applied to an easy to understand real-world problem. Finally, the. NET optimized form solves the same problem but exploits the latest, most effective programming techniques available in. NET 4. We suggest you start with the most popular patterns. In the 'Gang of Four Design Patterns 4.
In that same document we also explain when and where each pattern is used and how Microsoft uses the pattern in their. NET Framework libraries. These patterns are based on a book titled Head First Design Patterns. Many developers really enjoy this book. It explains design patterns in a light-hearted, easy-to-understand manner. The Head First patterns in the book are the same as the 23 GoF patterns discussed in Step A, but they are written for Java developers and all code examples are in Java.
As part of this Design Pattern Framework you have received. This will allow you to read about the patterns in the book while referencing our. NET Head First design pattern code examples. This combination of an easy-to-read book with. NET code samples should get you up to speed quickly with patterns. Please note that the 'Head First' book itself is not included in this package. Page 9 of 16 The. To open these files you will need a copy of the Visio Viewer or the full version.
Applying Design Patterns Once youre familiar with the concept of design patterns and have explored the commonly used GoF design patterns, you are ready to move on to the next two categories of patterns: the Enterprise patterns and the Model View patterns. These patterns are best studied in the context of a real-world app. To this end, this package comes with 2 comprehensive applications: they are called Patterns in Action 4.
It is best to start with Patterns in Action followed by Spark.
These applications demonstrate when, where, and how design patterns GoF, Enterprise, and Model View are used in a multi layered architecture. The use of patterns is demonstrated throughout the entire application stack, that is, anywhere in the application. New in this release is Spark 4. Spark is a light-weight application platform that allows developers to build applications quickly and easily. It uses a limited set of pattern, practices and tools, which helps in creating very fast and agile solutions.
Art Shop is the name of the reference application built with Spark. The ODBC architecture decouples an abstraction from its implementation so that the two can vary independently. NET libraries themselves. A classic example of the Bridge pattern is when coding against device drivers. Page 31 of Composite lets clients treat individual objects and compositions of objects uniformly.
Composite Definition Compose objects into tree structures to represent part-whole hierarchies. Structural sample code The structural code demonstrates the Composite pattern which allows the creation of a tree structure in which individual nodes are accessed uniformly whether they are leaf nodes or branch composite nodes. Page 32 of Structural Real-world sample code The real-world code demonstrates the Composite pattern used in building a graphical tree structure made up of primitive nodes lines.
A leaf has no children. The composite pattern is a great candidate for generics and you will find these used throughout this example. Leaf PrimitiveElement o o represents leaf objects in the composition. This is an open type which has the ability to accept any type parameter. This code demonstrates much of the power that generics offer to.
UI namespace. A tree control is a great example of a Composite pattern. It is used like any other collection. The Control class supports operations that apply to all Controls and their descendants in their respective environments as well as operations that deal with child controls for example the Controls property which returns a collection of child controls.
Examples are the Control class of which there are two versions. Composite in the. All nodes in the Composite pattern share a common interface which supports individual items as well as groups of items. Forms namespace and the other for ASP. NetOptimized Composite: Page 33 of This common interface greatly facilitates the design and construction of recursive algorithms that iterate over each object in the Composite collection.
The nodes of the tree either contain an individual object leaf node or a group of objects a subtree of nodes. The class named Shape does implement this generic interface so that comparisons can be made between shape objects. NET developers. NET apps in the System. This facilitates the process of adding and removing shapes from the list of tree nodes. Page 34 of NET framework. WPF also has many built-in controls that are Composites.
Decorators provide a flexible alternative to subclassing for extending functionality. Decorator Definition Attach additional responsibilities to an object dynamically. NET optimized code demonstrates an example of the Decorator design pattern that uses generics.
Structural Real-world sample code The real-world code demonstrates the Decorator pattern in which 'borrowable' functionality is added to existing library items books and videos. Video o o defines an object to which additional responsibilities can be attached. Decorator Decorator maintains a reference to a Component object and defines an interface that conforms to Component's interface.
Structural sample code The structural code demonstrates the Decorator pattern which dynamically adds extra functionality to an existing object. Page 35 of Decorator in the. NET extension methods are a close cousin to this pattern as they also offer the ability to add functionality to an existing type even if the type is sealed. It is polymorphic with the original class so that clients can invoke it just like the original class. The Decorator pattern combines polymorphism with delegation.
Decorator classes usually have a constructor with an argument that represents the class they intent to decorate: Flush and others. As an aside. In most cases. The Stream class is an abstract class that reads or writes a sequence of bytes from an IO device disk. NET Framework include a set of classes that are designed around the Stream class. The BufferedStream class is a Decorator that wraps the Stream class and reads and writes large chunks of bytes for better performance.
Page 36 of Decoration is a flexible technique because it takes place at runtime. Facade Definition Provide a unified interface to a set of interfaces in a subsystem. Page 37 of Loan implement subsystem functionality.
Subsystem classes Bank. In a 3-tier application the presentation layer is the client. Page 38 of Structural Real-world sample code The real-world code demonstrates the Facade pattern as a MortgageApplication object which provides a simplified interface to a large subsystem of classes measuring the creditworthiness of an applicant. NET automatic properties and object initializer on the Customer class. The only difference is the use of.
NET optimized sample code This code is essentially the same as the real-world example. It exposes a simple API to the client. Facade in the. Facades themselves are frequently implemented as singleton abstract factories. It is used in scenarios where there is a need to present a simplified view over more complex set of types.
An example of an aggregate component is System. To discuss this properly we need to distinguish high-level architectural Facades from lower level component type facades. SmtpMail to send mail messages. This service layer. SerialPort which is a powerful serial port class. WebClient which provides a high-level interface for sending and retrieving data from a network resources identified by a general URI.
MessageQueue which provides access to a queue on a Message Queue server. NET Framework In the. Page 39 of Other aggregate component examples include: Complex operations. Flyweigth Definition Use sharing to support large numbers of fine-grained objects efficiently. The objective of the. NET developer can see. This is what the Microsoft developers working on the.
NET Framework libraries are dealing with all the time. Page 40 of Facades may reduce the expressiveness of the API. It is common for UnsharedConcreteFlyweight objects to have ConcreteFlyweight objects as children at some level in the flyweight object structure as the Row and Column classes have. A ConcreteFlyweight object must be sharable. Any state it stores must be intrinsic. ConcreteFlyweight CharacterA. Structural sample code The structural code demonstrates the Flyweight pattern in which a relatively small number of objects is shared many times by different clients.
Page 41 of When a client requests a flyweight. CharacterZ o implements the Flyweight interface and adds storage for intrinsic state. The Flyweight interface enables sharing. NET Optimized code sample. Examples include. NET uses Flyweights for strings that are declared at compile time and have the same sequence of characters. NET optimized code uses a generic Dictionary collection to hold and quickly access Flyweight Character objects in memory.
Shared flyweight objects are immutable. You will find flyweights mostly in utility type applications word processors. Page 42 of Flyweights are usually combined with the Factory pattern as demonstrated in the.
They are rarely used in data-driven business type applications. NetOptimized Flyweight: The stateless flyweights refer to the same memory location that holds the immutable string. Flyweights are used internally in the. Proxy Definition Provide a surrogate or placeholder for another object to control access to it.
NET Framework as a string management technique to minimize memory usage for immutable strings.
NET Framework As mentioned above. Page 43 of Structural Real-world sample code The real-world code demonstrates the Proxy pattern for a Math object represented by a MathProxy object.
Page 44 of Structural sample code The structural code demonstrates the Proxy pattern which provides a representative object proxy that controls access to another similar object. Proxy may refer to a Subject if the RealSubject and Subject interfaces are the same. Typically this occurs when there is a dependency on a remote resource a call to another server for example or when an object takes a long time to load.
Clients of these objects expect this work to be done quickly and efficiently. The interface of the Proxy object is the same as the original object and clients may not even be aware they are dealing with a proxy rather than the real object.
This code demonstrates the Remote Proxy pattern which provides a representative object i. The Proxy forwards the request to a target object. The proxy pattern is meant to provide a surrogate or placeholder for another object to control access to it.
NetOptimized Proxy: NET features.. Page 45 of There are 3 different types of proxies: A Smart Reference is a proxy for a pointer.
NET it is unlikely that you need this proxy type. As is common with proxies. Chain of Responsibility Definition Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Proxy in the. NET Framework In. NET Remoting. Chain the receiving objects and pass the request along the chain until an object handles it.
Clients of WCF services also rely heavily on auto-generated proxy objects. Page 46 of NET the Proxy pattern manifests itself in the Remoting infrastructure. President handles requests it is responsible for can access its successor if the ConcreteHandler can handle the request. Page 47 of The Successor settings are simplified by using properties.
Loosely coupled objects have the advantage that they are easier to maintain and easier to change compared to systems where there is tight coupling between objects i.
Page 48 of The delegates are implemented using generics in which event handlers are type safe and not restricted to senders of type object but rather to types that are appropriate for the event — in the sample code type Approver see.
NetOptimized Chain of Responsibility: Each position has can have its own set of rules which orders they can approve.
The chain of responsibility pattern is frequently used in the Windows event model in which a UI control can either handle an event for example a mouse click or let it fall through to the next control in the event chain. NET you can identify a Chain of Responsibility in the Windows event model where each UI control can decide to process an event or let it fall through to the next control in the event chain.
This is slightly different from the GoF definition in which just one object in a chain decides to handle the request.
Occasionally you may run into a Chain of Responsibility implementation in which a chain of objects process a message between a sender and a receiver. Note that the Chain-of-Responsibility pattern is rarely used in business application development. This pattern requires a way to order the search for an object that can handle the request.
NET Remoting in which a message between a client and a server passes through one or more so-called message sinks. This search is usually modeled according to the specific needs of the application domain. Page 49 of Message sinks form a chain as each sink has a reference to the next sink in the chain. Chain of Responsibility in the. Page 50 of Command Definition Encapsulate a request as an object.
Structural sample code The structural code demonstrates the Command pattern which stores requests as objects allowing clients to execute or playback the requests. Page 51 of In this example the abstract Command class has been replaced by the ICommand interface because the abstract class had no implementation code at all.
Note that in C the word 'operator' is a keyword. Prefixing it with ' ' allows using it as an identifier. Structural Real-world sample code The real-world code demonstrates the Command pattern used in a simple calculator with unlimited number of undo's and redo's. The classic usage of this pattern is a menu system where each command object represents an action and an associated undo action. All Commands implement the same interface, so they can be handled polymorphically.
Typically their interface includes methods such as Do and Undo or Execute and Undo. Areas where you find Command patterns are: Command in the. NET, use the Command pattern to support their menus, toolbars, shortcuts, and associated undo functionality. We would have expected that the Command pattern would be exposed in.
NET as part of a unified WinForms command routing architecture, but they are not. Until several years ago the Command patterns was not generally used in the.
Definition Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the.
NonterminalExpression not used o o o one such class is required for every rule R:: Rn in the grammar maintains instance variables of type AbstractExpression for each of the symbols R1 through Rn. Interpret typically calls itself recursively on the variables representing R1 through Rn.
Client InterpreterApp builds or is given an abstract syntax tree representing a particular sentence in the language that the grammar defines. The abstract syntax tree is assembled from instances of the NonterminalExpression and TerminalExpression classes o invokes the Interpret operation.
Structural sample code The structural code demonstrates the Interpreter patterns, which using a defined grammer, provides the interpreter that processes parsed statements. Real-world sample code The real-world code demonstrates the Interpreter pattern which is used to convert a Roman numeral to a decimal. NET optimized code demonstrates the same code as above but uses more modern, built-in.
Here the abstract classes have been replaced by interfaces because the abstract classes have no implementation code. In addition, the parse tree which holds the collection of expressions ThousandExpression, HundredExpression, etc is implemented as a generic List of type Expression.
The Interpreter design pattern solves this particular problem — that of creating a scripting language that allows the end user to customize their solution. However, if you really need this type of control it is today probably easier and faster to use an existing command interpreter or expression evaluator tool out of the box.
Certain types of problems lend themselves to be characterized by a language. This language describes the problem domain which should be well-understood and welldefined.
In addition, this language needs to be mapped to a grammar. Grammars are usually hierarchical tree-like structures that step through multiple levels but end up with terminal nodes also called literals.
This type of problem, expressed as a grammar, can be implemented using the Interpreter design pattern. The well-known Towers of Hanoi puzzle is an example of the type of problem that can be encoded by a simple grammar and implemented using the Interpreter design pattern.
The Interpreter design pattern shares similarities with several other patterns. Just like State and Strategy, it delegates processing to a set of dedicated classes. It also has similarities with the Composite pattern; basically Interpreter is an enhancement of Composite although it frequently requires more complex object groupings compared to the Composite pattern.
Interpreter in the. NET Framework libraries. Page 56 of ConcreteIterator Iterator implements the Iterator interface. Iterator Definition Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
In this example the IEnumerable and IEnumerator interfaces are implemented using. C offers built-in iterator support with the yield return keyword which makes implementing the IEnumerable and IEnumerator interfaces easier and faster even when iterating over trees and other more complex data structures. NET's built-in generic Iterator design pattern. Structural Real-world sample code The real-world code demonstrates the Iterator pattern which is used to iterate over a collection of items and skip a specific number of items each iteration.
Page 57 of While and For Each. NetOptimized Iterator: Both languages have a built-in construct that facilitates iterating over collections: Page 58 of These collections may be stored as an array.
Pattern : Implementation
Not only do you find the Iterator design pattern deep into the. WriteLine vote. The Iterator design pattern solves this problem by separating the collection of objects from the traversal of these objects by implementing a specialized iterator class. Page 59 of Mediator Definition Define an object that encapsulates how a set of objects interact.
Mediator promotes loose coupling by keeping objects from referring to each other explicitly. At this point only one-to-one communication is implemented in the Chatroom. Structural Real-world sample code The real-world code demonstrates the Mediator pattern facilitating loosely coupled communication between different Participants registering with a Chatroom.
Page 60 of The mediator is a central hub through which all interaction must take place. The Chatroom is the central hub through which all communication takes place. The Mediator is the pattern that flags these kinds of incompatibilities.
Page 61 of Another area where Mediator is used is in complex configuration scenarios. Mediator in the. NetOptimized Mediator: A simple Mediator rule would be: For example a particular graphics card may not work with a certain type of monitor. This model is useful for scenarios where there is a need to manage complex conditions in which every object is aware of every state change of other objects in the group. Take for example a dialog in which you enter options to make a flight reservation.
When selecting custom options for your computer. Its main role is to determine whether a particular combination of hardware components work together or not.
The Mediator pattern is often used in the development of complex dialog boxes. Page 62 of Mementos have effectively two interfaces. Memento Definition Without violating encapsulation. The memento may store as much or as little of the originator's internal state as necessary at its originator's discretion. Caretaker sees a narrow interface to the Memento -.
The Originator class is decorated with the Serializable attribute. Structural Real-world sample code The real-world code demonstrates the Memento pattern which temporarily saves and then restores the SalesProspect's internal state Code in project: It will take any serializable object and save and restore it.
Note that this approach is not necessarily the most efficient because of the relatively expensive serialization and deserialization steps. Structural sample code The structural code demonstrates the Memento pattern which temporary saves and restores another object's internal state Code in project: In this example the Memento is more general.
NetOptimized Memento: Page 63 of NET offers and therefore qualifies as an example of Memento in the. Storage options include memory for example Session. Page 64 of Deserialization is the process of taking in stored information and recreating objects from it. This is what the serialization architecture of. Memento in the. Scenarios in which you may want to restore an object into a state that existed previously include: In a sense you can view a database as an implementation of the Memento design pattern.
Observer Definition Define a one-to-many dependency between objects so that when one object changes state. NET Framework Serialization is the process of converting an object into a linear sequence of bytes for either storage or transmission to another location.
Page 65 of Any number of Observer objects may observe a subject provides an interface for attaching and detaching Observer objects. ConcreteSubject IBM stores state of interest to ConcreteObserver sends a notification to its observers when its state changes Observer IInvestor defines an updating interface for objects that should be notified of changes in a subject.
NET multicast delegates which are an implementation of the Observer pattern. NET languages themselves. Delegates are type safe function pointers that have the ability to call a method. NET you often work with events and event handlers. NetOptimized Observer: Events and Delegates.
Page 66 of Generic delegates allow for event handler-specific arguments. Structural Real-world sample code The real-world code demonstrates the Observer pattern in which registered investors are notified every time a stock changes value Code in project: When programming in. This example uses. NET Framework -. The event and delegate paradigm in. The Observer pattern facilitates good object-oriented designs as it promotes loose coupling. The subject does not depend on any particular observer.
NET represents an elegant and powerful implementation of the Observer design pattern. Page 67 of NET languages and. State Definition Allow an object to alter its behavior when its internal state changes.
NET event model is implemented with the Observer design pattern and is found throughout the. Observer in the. NET class libraries. The object will appear to change its class. Observers register and unregister themselves with subjects that maintain a list of interested observers. GoldState o each subclass implements a behavior associated with a state of Context Structural sample code The structural code demonstrates the State pattern which allows an object to behave differently depending on its internal state.
Concrete State RedState. Page 68 of Structural Real-world sample code The real-world code demonstrates the State pattern which allows an Account to behave differently depending on its balance. The difference in behavior is delegated to objects that represent this state Code in project: SilverState and GoldState.
This approach reduces the need for intricate and hard-to-trace conditional if and case statements relying instead on polymorphism to implement the correct functionality of a required state transition. The goal of the State design pattern is to contain state-specific logic in a limited set of objects in which each object represents a particular state. These states represent overdrawn accounts. This example demonstrates a non-deterministic Finite State Machine with 5 possible states note: These types of objects are called stateful objects.
In this pattern you encapsulate state specific behavior in a group of related classes each of which represents a different state. Page 69 of NET example is interesting in that it combines two patterns: A client can change the state of an object by making property or method calls which in turn change the instance data values.
This complexity may spread to numerous classes and to contain it you use the State design pattern. State is frequently a core concept in complex systems. State transition diagrams also called state machines are very helpful in modeling these complex systems. NetOptimized State: State in the. Strategy lets the algorithm vary independently from clients that use it.
Page 70 of Strategy Definition Define a family of algorithms. Structural Real-world sample code The real-world code demonstrates the Strategy pattern which encapsulates sorting algorithms in the form of sorting objects. This allows clients to dynamically change algorithmic strategies Code in project: The collection of students is implemented using a generic List.
The setter method SetStrategy has been implemented as a. This allows clients to dynamically change sorting strategies including Quicksort. MergeSort o o o o implements the algorithm using the Strategy interface Context SortedList is configured with a ConcreteStrategy object maintains a reference to a Strategy object may define an interface that lets Strategy access its data. NET property. Page 71 of Structural sample code The structural code demonstrates the Strategy pattern which encapsulates functionality in the form of an object.
If the Strategy interface has only a single method you can simplify the implementation by using a delegate rather than an interface.
If a customer on an shopping website prefers to pay with PayPal over Amazon the application can simply swap the PayPal strategy class out for the Amazon strategy class.
An example is credit card processing. Page 72 of Classes that implement the IComparer interface are implementations of the Strategy design pattern. These methods sort the elements in the list using a given class that implements the IComparer interface. The client calls a method on a particular interface which can be swapped out with any other Strategy class that implements the same interface. Strategy in the. Strategy is useful in many different scenarios.
IComparer contains a Sort method that compares two objects and returns a value indicating whether one object is greater than. Its intent is to encapsulate alternative strategies for a particular operation. If you think about it. Template Method Definition Define the skeleton of an algorithm in an operation.
The template method calls primitive operations as well as operations defined in AbstractClass or those of other objects.
Model View Controller (MVC)
Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure. Page 73 of Page 74 of NET optimized example is similar to the RealWorld code as there are no meaningful. The implementation of these steps is deferred to the CustomerDataObject subclass which implements the Connect. This is an elegant example of the Template method pattern. A recent example is the Layout system in WPF. The Template pattern is often found in UI programming.
NetOptimized Template Method: NET optimizations. Structural Real-world sample code The real-world code demonstrates a Template method named Run which provides a skeleton calling sequence of methods.
14,000+ developers trust dofactory
One or more steps can be deferred to subclasses which implement these steps without changing the overall calling sequence. The difference is that with Strategy the entire algorithm is changed. Out of the box these base classes handle all functionality that are common to all controls.
Page 75 of New in this release is Spark 4. Composite: many examples System. Loosely coupled objects have the advantage that they are easier to maintain and easier to change compared to systems where there is tight coupling between objects i. Page 80 of This will create the database and the data. You'll find it used more often in specialized types of apps.
The debugger is a great tool to help in tracing the execution through the different layers. You're getting over documentation pages with important details on each of the the patterns, architectures, components, and applications.
In the 'Gang of Four Design Patterns 4.
- ADOBE INDESIGN CS6 MANUAL PDF
- ANCHOR CROSS STITCH PATTERNS PDF
- WEB SERVICE PATTERNS JAVA EDITION PDF
- ARCHITECTURAL LIGHTING DESIGNING WITH LIGHT AND SPACE PDF
- PHOTOVOLTAIC DESIGN AND INSTALLATION MANUAL PDF
- THE NON-DESIGNERS DESIGN BOOK PDF
- BOLLYWOOD BODY BY DESIGN PDF
- DESIGNING WEB USABILITY THE PRACTICE OF SIMPLICITY EBOOK
- INTERIOR CONSTRUCTION & DETAILING FOR DESIGNERS AND ARCHITECTS PDF
- NCERT 6TH CLASS SOCIAL SCIENCE BOOK
- SNOW FALLING ON CEDARS PDF
- PDF BOOKS ER FOR ANDROID
- SF 700 PDF
- UPSTREAM ADVANCED STUDENTS BOOK
- DIE BETROGENE EPUB