Title: Case Study
1 2Case study
- GUI (Graphical User Interface) toolkit
- A typical GUI has many different objects
- Menu, window, button, scrollbar, . . .
- Hierarchical (tree-like) structure
- Like a file directory
- A window has several windows and buttons
- OO provides an elegant solution to GUI problems
- Most successful example Apple Macintosh
3How to draw GUI objects?
- Put all concrete objects into a Glyph container
ask each Glyph to draw itself
Glyph container
Glyph (System provided) Draw()
Glyph Draw()
Add
Glyph Draw()
Concrete Glyph (user provided) Draw()
Glyph Draw()
Glyph Draw()
4How to draw GUI objects?
- Glyph window new Button(),
- new ScrollBar()
- foreach (g in Window) g.Draw()
Glyph virtual void Draw()
Button void Draw()
ScrollBar void Draw()
Panel void Draw()
5Upcasting and polymorphism
- Create concrete objects
- new Button(), new ScrollBar()
- Add to an abstract container
- Container only knows abstract base class Glyph
- Upcasting
- Button is upcasted to Glyph
- Polymorphism
- All concrete objects are treated uniformly (same)
as Glyph - foreach (g in Window) g.Draw()
6Composition
- Is Window a kind of glyph?
- Yes, window shares many common properties with
buttons, scroll bars, panel, . . . - Is-a relationship inheritance
Glyph
is-a
Window
Button
ScrollBar
Panel
7Composition
- But Window can have some buttons, scroll bars,
etc. - Has-a relationship composition
- Window has a number of glyphs
has-a
Window
Glyph
is-a
Button
ScrollBar
Panel
8Is-a and Has-a relationships
- Is-a
- Inheritance
- Window is-a Glyph
- class Window Glyph
-
- . . .
-
- Has-a
- Composition
- Window has-a few buttons, windows
- class Window
- Glyph g
- . . .
9Composite pattern
- Combining is-a and has-a
- class Window Glyph //inheritance
- Glyph g //composition
- . . .
-
- So that we can have a window inside a window
Glyph
is-a
has-a
Button
ScrollBar
Panel
Window
10An even more general form of composite pattern
- Can support any complex structure imaginable
- e.g. a Window inside a Button
- Glyph has-a Glyph container
- class Glyph
- Glyph g
- . . .
-
has-a
Glyph
is-a
Button
ScrollBar
Panel
Window
11An even more general form of composition pattern
- class Window Glyph
- . . .
-
- Window inherits the Glyph container from Glyph
- Support Window inside a Button
has-a
Glyph
is-a
Button
ScrollBar
Panel
Window
12Limitation of inheritance
- How to change to a different Button at run time?
Glyph container
Glyph (System provided) Draw()
Glyph Draw()
Add
Glyph Draw()
Concrete Glyph (user provided) Draw()
Glyph Draw()
Glyph Draw()
13Limitation of inheritance
- Base classs Draw() is overrided by the subclass
- The actual Draw() is done by the concrete
subclass - To draw a different look-and-feel button?
- Tedious, has to replace the old Button object in
the container by a new one that has a different
Draw()
14Delegation
- Outsource the drawing action to a drawing object
- So that we can change the look-and-feel by
changing the drawing object at run-time
Glyph container
Glyph DrawStyle obj Draw()
obj.Draw() ChangeStyle( DrawStyle newobj)
obj newobj
Add
Glyph Draw()
DrawStyle Draw()
Glyph Draw()
Glyph Draw()
15The essential ideas of OO
- INHERITANCE (is-a)
- Similar types of objects that share the same
interface - COMPOSITION (has-a)
- An object that is made up from other objects
- DELEGATION
- To outsource work to another object
- Delegation has the same syntax as composition
16Design of Callback
- What is callback?
- The mechanism of sending messages between objects
- e.g. a mouse button is clicked, how to send this
mouse-up event message to a mouse-up handler? - Window Server
- Contains GUI objects (Button, ScrollBar, )
- If mouse is clicked, window server finds the
clicked object in its container, and calls the
objects OnClick() virtual function - You provide the implementation of OnClick()
17Callback by inheritance
- Build the MyWindow class inherited from Form
(Form is like Glyph in prev example) - Override OnClick()
- Add concrete MyWindow object to container as Form
Window Server
Container
Form virtual OnClick()
Form (Button) virtual OnClick()
Form (ScrollBar) virtual OnClick()
MyWindow override OnClick()
18Get callback by inheritance
- using System
- using System.Windows.Forms
- class MyWindow Form
- static void Main()
- Application.Run(new MyWindow())
- //start a window and wait for input event
-
- protected override void OnClick(EventArgs e)
- Console.WriteLine(I(the Form) am clicked)
- base.OnClick(e) //forward to parent (Form)
- //in case there are more things to
do
19OO in one picture
www.vec.ca/images/Gift-Basket.JPG
20OO is like a basket of fruits
- The basket is a container of fruits
- Important
- You have just made an abstraction
- Physically the container has different concrete
objects (apples and oranges), but because of your
abstraction, you have generalized them as fruits - You dont see apples, oranges, only fruits
- Program to an interface, not implementation
- You use the objects as fruits (interface), not
apples and oranges (implementation)
21Your abstract view
- Program to an interface, not an implementation
- Abstract and flexible programming
Container
Fruit Eat()
Fruit Eat()
22Your abstract view
- What if you eat a fruit?
- Pick a fruit object from the container and eat it
- fruit.Eat()
- What happens next?
- If fruit is an Apple, it tastes like an apple
- If it is an Orange, it tastes like an orange
- Your leave the actual implementation to the
hidden concrete objects
23The concrete view
Container
Fruit Eat()
Fruit Eat()
Fruit Eat()
Banana Eat()
Orange Eat()
Apple Eat()
Orange Eat()
Apple Eat()
24Library application
Container
Lendable Borrow()
Lendable Borrow()
Journal Borrow()
DVD Borrow()
Book Borrow()
Lendable Borrow()
Lendable Borrow()
25Bank application
Container
Account Deposit()
Account Deposit()
USD Deposit()
Current Deposit()
Saving Deposit()
Account Deposit()
Account Deposit()
26Game application
- Attack() is done by collision detection of
rectangles
Container
Fighter Attack()
Fighter Attack()
Sasuke Attack()
Sakura Attack()
Naruto Attack()
Fighter Attack()
Fighter Attack()
27Callback by delegation
- Store a handler pointer into an object of type
EventHandler - Add the EventHandler object to Form
Window server
Container
obj Handler()
EventHandler obj.Handler()
Form
Point to a handler function
28Callback by delegation
- class MyWindow Form
- static void Main()
- Application.Run(new MyWindow())
-
- public MyWindow()
- this.MouseUp new EventHandler(this.Handler())
- //MouseUp is a container
- private void Handler(object sender,System.EventAr
gs e) - Console.WriteLine(call from 0,sender.ToStrin
g()) -
object
function pointer
Handler function
29Differences between the two approaches
- Callback by inheritance is easier to understand
- The mechanism is more direct and simple
- Callback by delegation is more powerful
- Can callback to multiple handlers (multicasting)
by adding several EventHandler objects to the
MouseUp container in Form - Can change the callback handler at run-time by
changing the EventHandler object
30Delegate how to Build your own handler object
- delegate keyword
- A built-in C keyword that helps you to create
your own EventHandler object easily - public delegate void MyHandler(Student s)
- This instruction creates the class MyHandler for
you - A MyHandler object can encapsulate any function
pointer with a matched signature (void and
Student)
31Example of using delegate to generate handler
- public delegate void CallbackDelegate(String s)
- //a Callback class is generated automatically
- Main()
- ArrayList list new ArrayList()
- Client c new Client()
- list.Add(new Callback(c.Notify())
- foreach ( (Callback) obj in list)
- obj(server)
-
- Class Client
- private void Notify(String s)
- Console.WriteLine(call from 0,s)
-
The function pointer
This object function is called from list
32Game application
- Implementation reuse is best done by delegation
Container
Fighter Attack()
Fighter Attack()
ConcreteFighter Image _image Weapon
_w Draw() Attack() _w.Attack()
Fighter Attack()
Weapon Attack()
Fighter Attack()
Fire Attack()
Sand Attack()
33Visual Studio Window Forms
- Tool that helps you to design a GUI easily
- Open a new project and choose Window Forms
- Drag and drop GUI into the Form
34Add a Button
- In ToolBox window, drag a Button object and drop
it to the position you want in the Form
35What Visual Studio has done
- Initially Visual Studio has an empty container
- Your action (dragging a button) causes
- A button is created and added to the container
- Visual Studio then asks objects in the container
to draw themselves, that is why you see the button
36Change Buttons properties
- Can resize and move the button, and use the
Properties window of the button to change the
name.
37What Visual Studio has done
- Your action (select the button) causes
- Collision detection
- Visual Studio checks the mouse pointer position
and sees which object in its container is hit - Find the button object
- Your further action acts on the button invokes
methods inside the button which change the
attributes of the button
38The generated code (view by right click on the
form)
- public class Form1 System.Windows.Forms.Form
- private System.Windows.Forms.Button button1
- static void Main()
- Application.Run(new Form1())
-
- public Form1()
- InitializeComponent()
-
- private void InitializeComponent()
- this.button1 new System.Windows.Forms.Button()
- //. . .
-
- protected override void Dispose( bool disposing
) - //. . .
-
39Notes
- Application.Run(new Form1())
- Run() is a static method that has a loop to
process the event messages - The Main() is very small !
- Constructor of Form1() calls InitializeComponent()
- InitializeComponent() simply create all the GUI
controls and add them to the container of Form1 - Dispose()
- Call by application in exit to free unmanaged
resources (more about this later)
40InitializeComponent()
- region Windows Form Designer generated code
- private void InitializeComponent()
- this.button1 new System.Windows.Forms.Button()
- this.button1.Text "Click Me !"
- this.Controls.Add(this.button1) //add to
container - . . .
-
- endregion
- Controls is a Property
- this.Controls return a reference to a container
41What Visual Studio has done
- InitializeComponent() is the main part in the
code generation (the rest are just boilerplate
code) - Visual Studio simply asks each object in its
container to output code based on its stored
information - A button would simply generate the constructor
code and the Text code, then adds itself to the
container this.Controls - this.Controls is used by window server for
collision detection, etc
42Class diagram of Windows Form
Object
MarshalByRefObject
Control.ControlCollection
1
Component
Control
ScrollableControl
ButtonBase
PictureBox
Button
Panel
ContainerControl
Form
43Class diagram of Windows Form
- Where is the container?
- How does this class structure supports
composition (has-a) relationship? - Each Control has a ControlCollection (container)
- Each ControlCollection can have many Controls
- What is the equivalent of class Glyth in this
structure? - Control
44Invalidate()
- A single command that invokes the action of
redrawing all the GUI items in Form - Invoke whenever the window is dirty
- e.g. resize, expose,
- Window server calls this.Invalidate(), which
sends a message to the message queue that will be
processed by the Application.Run() loop - Form ask all Controls in its container to draw
itself - Each Control asks Controls in its container to
draw itself (recursion)
45Unmanaged resource
- Unmanaged resource is resource that is not
managed by the garbage collector (e.g. memory
obtained from Cs malloc(), must be deleted by
the user) - Managed resource is a key advantage of C/Java
over C/C - When garbage collector is invoked, it calls
Finalize() automatically - Finalize() is the C destructor (opposite of
constructor) - Can have user code to remove unmanaged resource
- If you dont have unmanaged resource, then you
dont need to write object.Finalize()
46Dispose()
- Problem with Finalize()
- Finalize()can only be invoked by GC, but GC is
only called when system runs out of memory - For critical resources, this is too late
- e.g. opened file, opened database connection,
want to close as soon as possible - Solution
- Called Dispose() explicitly
- If you use Dispose(), then you should call
GC.SuppressFinalize()to suppress Finalize() - Otherwise the object will be clear twice
47Dispose()
- Finalize() is a method in System.Object
- Supported by all classes
- Dispose() is NOT a method in System.Object
- For an object to support Dispose(), must inherit
the IDisposable interface and implement the only
function Dispose() - Base class Form support IDisposable , it provides
a do-nothing default - You cannot use Dispose() to remove managed
resource, managed resource can only be released
by garbage collector
48Using
- The special construct Using calls Dispose()
automatically whenever it is out of scope - Standard usage
- static void Main()
- using (Form1 frm new Form1())
- Application.Run(frm)
- //frm.Dispose() called here
-
49 50.Net Remoting layer
- How to simplify network programming?
- Some key terms
- Object serialization
- Proxies
- Marshaling by reference / value
- Server activated objects
51Serialization
- Convert the state of an object into a linear
sequence of byte stream, and send it to another
computer - To make an object serializable, label the class
with Serializable attribute - Serializable
- public class Student
- . . .
-
- Default is no serialization, for security reason
52Serialization Formatter
- Different formats for sending the serialized
objects - Binary format
- SOAP (Simple Object Access Protocol) format
- XML format
- using System.Runtime.Serialization.Formatters.Bina
ry - using System.Runtime.Serialization.Formatters.Soap
- Using System.Xml.Serialization.XmlFormatter
- SOAP is XML-based
- SOAP and XML use ascii characters, can be read by
human
53Saving objects to file by serialization
- //save object to file
- Student s new Student()
- FileStream fs File.Create(student.dat)
- BinaryFormatter format new BinaryFormatter()
- format.Serialize(fs, s)
- //retrieve the object from file
- FileStream fs File.OpenRead(student.dat)
- Student s (Student)format.Deserialize(fs)
54.NET Remoting
- Client
- The one who wants to use a remote object
- Server
- The one who provides the remote object
- Marshaling
- Describes how a remote object is passed to client
- Marshal-by-value (MBV)
- Client gets a copy of the remote object
- Marshal-by-reference (MBR)
- Client gets a proxy of the remote object
55- MBV
- Server passes a copy of remote object to client
- Any modification by the client wont affect the
original object in the server side - MBR
- Server passes a proxy of the object to the
client, the proxy acts as a reference to the
object - Any modification by the client changes the
original object in the server side
56Key elements in Remoting
- Proxy
- The local object in the client side that
impersonates the remote object - Formatter
- Channel TCP / HTTP
Client object
Remote object
Proxy
Channel
Formatter
Formatter
57Client-server programming using .NET Remoting
- A simple client-server program in OO
- Client gets a copy or a proxy of the remote
object - Use the object to send a message to server
- Server returns a message to client
- Example creates 3 projects
- SimpleClient.cs
- SimpleServer.cs
- Remote.cs
- Class for the remote object
- Use by both SimpleClient and SimpleServer
58Remote.cs
- //The MBR object at the server side
- using System
- namespace RemoteLib
- public class RemoteHello MarshalByRefObject
-
- public void SendMsg(string str) //from
client - Console.WriteLine("0",str)
-
- public string ReceiveMsg() //servers
response - return "hello world"
-
-
59SimpleServer.cs
- using System
- using System.Runtime.Remoting
- using System.Runtime.Remoting.Channels
- using System.Runtime.Remoting.Channels.Http
- using RemoteLib
- namespace SimpleServer
- class Server
- static void Main()
- HttpChannel c new HttpChannel(12345)
- ChannelServices.RegisterChannel(c)
- RemotingConfiguration.RegisterWellKnownServiceT
ype( - typeof(RemoteHello), "RemoteHelloObj.soap",
- WellKnownObjectMode.Singleton) //start the
server - Console.ReadLine() //to quit, just type
something -
-
60SimpleClient.cs
- using System
- using System.Runtime.Remoting
- using System.Runtime.Remoting.Channels
- using System.Runtime.Remoting.Channels.Http
- using RemoteLib
- class Client
- static void Main()
- HttpChannel c new HttpChannel()
- ChannelServices.RegisterChannel(c)
- object remoteObjActivator.GetObject(typeof(Remot
eHello), - "http//localhost12345/RemoteHelloObj
.soap") - RemoteHello simple (RemoteHello) remoteObj
//casting - simple.SendMsg("hello from client")
- Console.WriteLine(From server0",
simple.ReceiveMsg())
61History of Distributed Computing
- 1980 Remote Procedure Call (RPC)
- (to invoke functions in a remote machine)
- 1990 ORPC (Object-RPC)
- (to invoke methods in a remote object)
- 1990 CORBA by OMG (Object Management Group)
- Common Object Request Broker Architecture
- To support communication at object level in a
- heterogeneous environment
62Key Components in CORBA
- IDL Interface Definition Language
- ORB The middleware that takes care of the
- communication between objects, e.g.
- method invocation, parameters passing
client
IDL interface
IDL interface
server
ORB
stub
skeleton
Network
63Other similar models
- DCOM by Microsoft
- (Distributed Component Object Model)
- RMI by Java
- (Remote Method Invocation)
- Limitations
- DCOM and Java are platform specific
- For CORBA, both sides must run the same ORB
- ORBs from different vendors may have
interoperability problems
64- Interoperability issue
- Advent of e-commerce, want distributed computing
to be more widely available - With DCOM, RMI, or CORBA, the chance that both
ends run the same platform is not high - 2000 IBM and Microsoft proposed the web
- services which forms the basis for SOA
- (Service Orientated Architecture)
65SOA
- Power plant example
- A hundred years ago, each family had its own
power generator - Complex, you need to know how to fix the machine
- What happened next
- Development of power transmission grid
- Simple interface at client side (just a switch)
- Complexity of power generation at the power plant
side (the server) - Web services plan to follow the same development
- Complex server, thin clients
66 67Key Issues in SOA
- How to describe the interface of a remote object?
- By WDSL (Web Services Description Language)
- Describes the interface in XML (replace IDL)
- How to communicate with the remote object?
- By SOAP (Simple Object Access Protocol)
- To invoke a method, send a message that has the
name of the method and parameters - How to find objects that provide the services?
- By UDDI (Universal Description, Discovery and
Integration) - A directory service to search for web services
68Web services model
Server
Client
HTTP/SOAP
Concrete Object
Proxy object
URI
Interface
69WSDL is just a XML file
portType is similar to class
Method in a class
70- WSDL
- Use XML to describe a class
- .NET can generate the WSDL file automatically
from a class definition - Client can download the WSDL file, and use it to
create proxy objects - Many companies already provide the web services,
e.g. Amazon, Google
71A SOAP request to the server
- POST /InStock HTTP/1.1 Host www.stock.org
-
- xmlnssoap"http//www.w3.org/2001/12/soap-envelop
e"
-
- HSBC
-
-
-
Schema
Namespace of SOAP
Schema of your namespace m
parameter
method
72A SOAP response from server
- HTTP/1.1 200 OK
-
- xmlnssoap"http//www.w3.org/2001/12/soap-envelop
e" - "
-
- 34.5
-
-
-
73XML-Scheme
- Schema is a document that describes the abstract
structure of a data set - Like what you have done to describe the structure
of a class - XML schema provides a list of names (types) that
are used to define complex data structure
(similar to how you define a class or structure) - e.g a string type can be described by xsstring
74Why use XML?
- Syntax-wise XML file is similar to HTML
- The main reason of using XML is that it supports
namespaces - Namespace solved the problem of name collision
- An XML namespace is a collection of names,
identified by the URI reference - Elements in the XML namespace is defined by the
schema
75Key advantages of web services
- Free (Web Services) vs fee economic model (
CORBA) - Communication via HTTP port 80 channel
- Firewall friendly
- Use widely accepted standards
- Method invocation is via SOAP messages encoded in
XML - Interface definition is by WSDL, also in XML
- Interoperability problem solved by using protocol
based on SOAP and XML - Any node that supports HTTP, WSDL, and SOAP can
be connected to SOA