Quick Look at Design Patterns
in Android Development
Constantine Mars
Team Lead, Senior Developer @ DataArt
Slide 2
Slide 2 text
#gdg_dnipro_art
Patterns everywhere
Slide 3
Slide 3 text
#gdg_dnipro_art
What do “GOF Patterns” mean?
"Each pattern describes a problem which occurs over and over again in our environment,
and then describes the core of the solution to that problem, in such a way that you can use
this solution a million times over, without ever doing it the same way twice"
- Christopher Alexander
Slide 4
Slide 4 text
#gdg_dnipro_art
Pattern structure
1. Pattern name
2. Problem
3. Solution
4. Consequences
#gdg_dnipro_art
Principles
1. Class versus Interface Inheritance
2. Program to an interface, not an implementation
3. Favor object composition over class inheritance
4. Aggregation -> having or being part of
5. Acquaintance -> knows of (association, using)
6. Delegation
7. Inheritance versus Parameterized Types (generics, templates)
Slide 7
Slide 7 text
#gdg_dnipro_art
Applications of reuse
1. Toolkits - code reuse -> you write the main body of the application and
call the code you want to reuse
2. Frameworks - design reuse -> you reuse the main body and write the
code it calls
Slide 8
Slide 8 text
Pattern categorieS8 - GOF
Be together, not the same!
Slide 9
Slide 9 text
#gdg_dnipro_art
Creational Patterns
- Create objects
- Hide creation logic
- Do not use operator “new”
Give program more flexibility
to decide which objects to create
Slide 10
Slide 10 text
#gdg_dnipro_art
Structural Patterns
Class and object composition
Inheritance, interfaces and ways to
compose objects = obtain new
functionalities
Slide 11
Slide 11 text
#gdg_dnipro_art
Behavioral Patterns
It’s all about communication
Slide 12
Slide 12 text
#gdg_dnipro_art
A Mesh of XXIII
Slide 13
Slide 13 text
#gdg_dnipro_art
Table of Design Patterns by Vince Huston :)
Illustration from http://www.vincehuston.org/dp/
Slide 14
Slide 14 text
#gdg_dnipro_art
Organizing patterns space by GOF
Slide 15
Slide 15 text
Free your creativity while patterns work for you :)
Creational Patterns
Slide 16
Slide 16 text
#gdg_dnipro_art
Factory method
Define an interface for creating an object, but let subclasses decide which
class to instantiate
Slide 17
Slide 17 text
#gdg_dnipro_art
Abstract Factory
Captures how to create families of related product objects without
instantiating classes directly
Image from https://sourcemaking.com
Slide 18
Slide 18 text
#gdg_dnipro_art
Builder
Separate the construction of a complex object from its representation so
that the same construction process can create different representations
Slide 19
Slide 19 text
#gdg_dnipro_art
In Android
new AlertDialog.Builder(this)
.setTitle("Metaphorical Sandwich Dialog")
.setMessage("Metaphorical message to please use the spicy mustard.")
.setNegativeButton("No thanks", new DialogInterface.OnClickListener() { …
}})
.setPositiveButton("OK", new DialogInterface.OnClickListener() {...}})
.show();
Builder
Slide 20
Slide 20 text
#gdg_dnipro_art
Prototype
Specify the kinds of objects to create using a prototypical instance, and
create new objects by copying this prototype
Slide 21
Slide 21 text
#gdg_dnipro_art
Singleton
Ensure a class only has one instance, and provide a global point of access it
Slide 22
Slide 22 text
#gdg_dnipro_art
In Android
public class ExampleSingleton {
private static ExampleSingleton instance = null;
private ExampleSingleton() { // customize if needed }
public static ExampleSingleton getInstance() {
if (instance == null) { instance = new ExampleSingleton(); }
return instance;
} }
ExampleSingleton.getInstance();
Singleton
Slide 23
Slide 23 text
Building is under construction :)
Structural Patterns
Slide 24
Slide 24 text
#gdg_dnipro_art
Adapter
Convert the interface of a class
into another interface clients
expect. Adapter lets classes
work together that couldn't
otherwise because of
incompatible interfaces.
Slide 25
Slide 25 text
#gdg_dnipro_art
public class TribbleAdapter extends RecyclerView.Adapter {
private List mTribbles;
public TribbleAdapter(List tribbles) { this.mTribbles = tribbles; }
@Override public TribbleViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
View view = inflater.inflate(R.layout.row_tribble, viewGroup, false);
return new TribbleViewHolder(view); }
@Override public void onBindViewHolder(TribbleViewHolder viewHolder, int i) { viewHolder.configure(mTribbles.get(i));}
@Override public int getItemCount() { return mTribbles.size(); }
}
Adapter
Slide 26
Slide 26 text
#gdg_dnipro_art
Bridge
Allows separate class
hierarchies to work
together even as they
evolve independently
Image from https://sourcemaking.com
Slide 27
Slide 27 text
#gdg_dnipro_art
Composite
Captures the essence of
recursive composition in
object-oriented terms.
Slide 28
Slide 28 text
#gdg_dnipro_art
Decorator
Captures class and
object relationships that
support embellishment
by transparent
enclosure
Slide 29
Slide 29 text
#gdg_dnipro_art
Facade
Provide a unified interface to a set of interfaces in a subsystem. Facade
defines a higher- level interface that makes the subsystem easier to use
#gdg_dnipro_art
Proxy
Provide a surrogate or placeholder for another object to control access to it.
Slide 32
Slide 32 text
All about communication, change and interchange :)
Behavioral Patterns
Slide 33
Slide 33 text
#gdg_dnipro_art
Command
Abstract class to provide
an interface for issuing a
request. The basic
interface consists of a
single abstract operation
called "Execute."
Slide 34
Slide 34 text
#gdg_dnipro_art
public class MySpecificEvent { /* Additional fields if needed */ }
eventBus.register(this);
public void onEvent(MySpecificEvent event) {/* Do something */};
eventBus.post(event);
Command
Slide 35
Slide 35 text
#gdg_dnipro_art
Chain of Responsibility
Chain the receiving objects and pass the request along the chain until an
object handles italgorithm in an object
Slide 36
Slide 36 text
#gdg_dnipro_art
Iterator
General interface for access and traversal
Slide 37
Slide 37 text
#gdg_dnipro_art
Mediator
Define an object that encapsulates how a set of objects interact
Slide 38
Slide 38 text
#gdg_dnipro_art
Memento (Token)
Without violating encapsulation, capture and externalize an object's
internal state so that the object can be restored to this state later
Slide 39
Slide 39 text
#gdg_dnipro_art
Flyweight
Use sharing to support large numbers of
fine-grained objects efficiently.
Slide 40
Slide 40 text
#gdg_dnipro_art
Observer
Define a one-to-many dependency between objects so that when one object
changes state, all its dependents are notified and updated automatically
Slide 41
Slide 41 text
#gdg_dnipro_art
apiService.getData(someData)
.observeOn(AndroidSchedulers.mainThread())
.subscribe (/* an Observer */);
Observer
Slide 42
Slide 42 text
#gdg_dnipro_art
State
Allow an object to alter its behavior when its internal state changes. The
object will appear to change its class
Slide 43
Slide 43 text
#gdg_dnipro_art
Strategy
Encapsulating an algorithm in an object
Slide 44
Slide 44 text
#gdg_dnipro_art
Interpreter
Define a represention for
language grammar along
with an interpreter that
uses the representation to
interpret sentences in the
language
Slide 45
Slide 45 text
#gdg_dnipro_art
Visitor
Refer generally to classes
of objects that "visit"
other objects during a
traversal and do
something appropriate
Slide 46
Slide 46 text
Android Patterns
Bald, mad and superperformant! =)
#gdg_dnipro_art
Model-View-Controller (MVC)
●
Model: your data classes.
●
View: your visual classes
●
Controller: the glue between the two
Slide 50
Slide 50 text
#gdg_dnipro_art
Model-View-ViewModel (MVVM)
●
Model: your data classes.
●
View: your visual classes
●
ViewModel: exposes properties
●
Binder: generates ViewModel properties
Slide 51
Slide 51 text
#gdg_dnipro_art
Model-View-Presenter (MVP)
●
Model - interface defining the data
●
Presenter - retrieves data from
repositories (model), and formats it for
display in the view
●
View - passive interface that displays data
(the model) and routes user commands
(events) to the presenter
Slide 52
Slide 52 text
#gdg_dnipro_art
Other Patterns...
Loaders,
AsyncTasks,
Broadcast Receivers,
Intents,
Media Framework = Facade,
Object Pools,
Batching and caching
And many other...
Slide 53
Slide 53 text
UI Design Patterns
Have very similar rules, but are yet different
Slide 54
Slide 54 text
#gdg_dnipro_art
Links and books on GOF
- Joshua Kerievsky - Refactoring To Patterns
- Bruce Eckel - Thinking in Patterns with Java
- Eric Freeman - Head First Design Patterns
- Erich Gamma - Design Patterns: Elements
of Reusable Object-Oriented Software
- https://sourcemaking.com/design_patterns
- https://dzone.com/refcardz/design-patterns
- https://github.com/iluwatar/java-design-patterns
Slide 55
Slide 55 text
#gdg_dnipro_art
Links and books on Android Patterns
- Android Design Patterns https://unitid.nl/androidpatterns/
- Alex Lockwood http://www.androiddesignpatterns.com/
- Android Performance Patterns
https://www.youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
- TutsPlus
https://code.tutsplus.com/articles/introduction-to-android-design-patterns--cms-20808
- Ray Wenderlich
https://www.raywenderlich.com/109843/common-design-patterns-for-android
Slide 56
Slide 56 text
#gdg_dnipro_art
Links and books on UI Patterns
- Material Design Guidelines
https://material.io/guidelines/material-design/introduction.html#
- UI Patterns http://ui-patterns.com/patterns
- UI Pttrns https://pttrns.com/android-patterns
Slide 57
Slide 57 text
“
Patterns are everywhere -
from enterprise applications
to games and even devices,
the most important is to see them
Alexey Rybakov, DataArt Technical Evangelist
Slide 58
Slide 58 text
Constantine Mars
@ConstantineMars
+ConstantineMars
Q&A
Thank you!