![Page 1: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/1.jpg)
www.luxoft.com
REINVENTING DESIGN PATTERNS WITH JAVA8
Alexander Pashynskiy
Java Day 2016
![Page 2: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/2.jpg)
www.luxoft.com
About me:
• Lead Software Engineer in Luxoft
• More then 6 years experience in Java
• Agile and Lean practicioner
• Pragmatic and product oriented engineer
• Still learning and learn
Email: [email protected]
Twitter: @apashinskiy_cv
Alexander Pashinskiy
![Page 3: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/3.jpg)
www.luxoft.com
It’s my own experience…
Disclaimer
![Page 4: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/4.jpg)
www.luxoft.com
https://github.com/hunter1041/design-patterns
Samples:
![Page 5: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/5.jpg)
www.luxoft.com
Design Patterns
![Page 6: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/6.jpg)
www.luxoft.com
![Page 7: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/7.jpg)
www.luxoft.com
![Page 8: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/8.jpg)
www.luxoft.com
Not only
![Page 9: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/9.jpg)
www.luxoft.com
Not only Many, many more ...
![Page 10: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/10.jpg)
www.luxoft.com
• OOP (Resource acquisition is initialization, Servant, DI, Pool Objects, Null object …)
• FP (Functions, Monads, Lenz, Curring, …)
• Concurrency (Double-checked locking, Read-write lock, Thread-specific storage, …)
• Domain Specific (security, money, …)
• and many, many more
![Page 11: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/11.jpg)
www.luxoft.com
• Problem - Solution pairs • Similar (or same) solution - different intention (Strategy,
State …) • inheritance - composition game (OOP) • Adding level of indirection • Almost always trade-off
Design Patterns:
![Page 12: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/12.jpg)
www.luxoft.com
• 1994 year • For C++ • OOP
Two main principles: • "Program to an interface, not an implementation." • "Favor object composition over class inheritance." Sad:( Some GoF patterns do not stick to this principles
![Page 13: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/13.jpg)
www.luxoft.com
Evolution
![Page 14: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/14.jpg)
www.luxoft.com
Lambda -> lightwaight design tool
![Page 15: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/15.jpg)
www.luxoft.com
Template method
![Page 16: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/16.jpg)
www.luxoft.com
Template method
Type: behavioral
Definition: Define 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.
![Page 17: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/17.jpg)
www.luxoft.com
• Not only for data • BLSP • Violates “Single Responsibility” and encapsulation • High Coupling • Future behavior and frameworks inhereted • Broken “protected” in Java • Big hierarchy produces hell
Inheritance
![Page 18: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/18.jpg)
www.luxoft.com
Template method
• Inheritance is evil • Use composition • Part of an algorithm can be passed as a function • Utilize basic functional interfaces • Use function composition if possible
![Page 19: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/19.jpg)
www.luxoft.com
Template method
inheritance -> composition -> function composition
![Page 20: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/20.jpg)
www.luxoft.com
Template method
g.filterMailBox(f)
* Not strongly mathematical composition (contains ‘if’ logic)
![Page 21: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/21.jpg)
www.luxoft.com
Template method
![Page 22: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/22.jpg)
www.luxoft.com
Decorator
![Page 23: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/23.jpg)
www.luxoft.com
Decorator
Type: structural
Definition: Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality.
![Page 24: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/24.jpg)
www.luxoft.com
Decorator
just a function composition
g.andThen(f)
![Page 25: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/25.jpg)
www.luxoft.com
Decorator
![Page 26: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/26.jpg)
www.luxoft.com
Chain of Responsibility
![Page 27: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/27.jpg)
www.luxoft.com
Chain of Responsibility
Type: behavioral
Definition: Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.
![Page 28: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/28.jpg)
www.luxoft.com
Chain of Responsibility
chain of function composition
andThen andThen andThen andThen andThen
![Page 29: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/29.jpg)
www.luxoft.com
Chain of Responsibility
![Page 30: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/30.jpg)
www.luxoft.com
Adapter
![Page 31: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/31.jpg)
www.luxoft.com
Adapter
Type: structural
Definition: Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn't otherwise because of incompatible interfaces.
![Page 32: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/32.jpg)
www.luxoft.com
Adapter
• Utilise basic functional interfaces • Functional interfaces are interchangable • For different numbers of parameters - partially applied
function
![Page 33: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/33.jpg)
www.luxoft.com
Partially applied function
IntBinaryOperator add = (x, y) -> x + y ; IntUnaryOperator add5 = x -> add.applyAsInt(x, 5);
Partial application - process of transforming a function into a function with less parameters.
![Page 34: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/34.jpg)
www.luxoft.com
Partially applied function
Supported by java - :: operator
ToIntFunctiont<String> stringLength = String::length;
IntFunction<String> helloSubstring = "hello"::substring;
![Page 35: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/35.jpg)
www.luxoft.com
Partial application
• allows to set some (not all) parameters
• let the other parameters to be set later
• partially applied function can be reused and composed
• Powerful decoupling tool
![Page 36: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/36.jpg)
www.luxoft.com
Adapter
![Page 37: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/37.jpg)
www.luxoft.com
Proxy
![Page 38: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/38.jpg)
www.luxoft.com
Proxy
Type: structural
Definition: Provide a surrogate or placeholder for another object to control access to it.
![Page 39: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/39.jpg)
www.luxoft.com
Proxy
• Resource managing • Transactions • Logging • and more ...
![Page 40: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/40.jpg)
www.luxoft.com
Libs to create Proxy
• java.lang.reflect.Proxy • Byte Buddy • cglib • javassist
![Page 41: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/41.jpg)
www.luxoft.com
Proxy
• function composition • wrap a lambda • inverse of control – resource leasing
![Page 42: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/42.jpg)
www.luxoft.com
Proxy
![Page 43: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/43.jpg)
www.luxoft.com
Proxy
![Page 44: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/44.jpg)
www.luxoft.com
Strategy
![Page 45: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/45.jpg)
www.luxoft.com
Strategy
Type: behavioral
Definition: Define a family of algorithms, encapsulate each one, and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it.
![Page 46: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/46.jpg)
www.luxoft.com
Strategy
library of classes -> library of functions
![Page 47: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/47.jpg)
www.luxoft.com
Strategy
![Page 48: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/48.jpg)
www.luxoft.com
Iterator
![Page 49: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/49.jpg)
www.luxoft.com
Iterator
Type: behavioral
Definition: Provide a way to access the elements of an aggregate objects equentially without exposing its underlying representation.
![Page 50: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/50.jpg)
www.luxoft.com
Iterator
external iterator -> internal iterator
![Page 51: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/51.jpg)
www.luxoft.com
Iterator
• collections have internal foreach() • streams everywhere • if not - implement Spliterator
![Page 52: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/52.jpg)
www.luxoft.com
Iterator
![Page 53: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/53.jpg)
www.luxoft.com
Builder
![Page 54: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/54.jpg)
www.luxoft.com
Builder
Type: creational
Definition: Separate the construction of a complex object from its representation so that the same construction process can create different representations.
![Page 55: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/55.jpg)
www.luxoft.com
Builder
• classic runtime builder • classic reusable builder (a lot of boiler-plate) • or just use a consumer if applicable
- no boiler-plate - reusable (function composition) - chaining DSL - consumer has internal control on objet
![Page 56: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/56.jpg)
www.luxoft.com
Builder
say me how -> I will build as you want
![Page 57: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/57.jpg)
www.luxoft.com
Builder
![Page 58: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/58.jpg)
www.luxoft.com
Function composition
f: a -> b g: b -> c h: c -> d
f g h => andThan() ° °
![Page 59: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/59.jpg)
www.luxoft.com
Function composition
f: a -> b g: b -> c h: c -> d
f g h => andThan() ° °
f: a -> Mb g: b -> Mc h: c -> Md
Mb – container for b
![Page 60: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/60.jpg)
www.luxoft.com
Function composition
f: a -> b g: b -> c h: c -> d
f g h => andThan() ° °
f: a -> Mb g: b -> Mc h: c -> Md
f g h => flatMap() ° °
![Page 61: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/61.jpg)
www.luxoft.com
Monad
![Page 62: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/62.jpg)
www.luxoft.com
Monad
Represents (2 and more) states as a unified value in order to compose transformations
[User | Error] -> validate1 -> [User | Error] -> validate2 -> [User | Error ] -> get
User Error
User
of
![Page 63: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/63.jpg)
www.luxoft.com
Monad
• Puts a value in a computational context
![Page 64: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/64.jpg)
www.luxoft.com
Monad
• Puts a value in a computational context • Function composition on steroids
![Page 65: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/65.jpg)
www.luxoft.com
Monad
• Puts a value in a computational context • Function composition on steroids • Programmable semicolon
![Page 66: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/66.jpg)
www.luxoft.com
Monad
• Puts a value in a computational context • Function composition on steroids • Programmable semicolon • Chainable container
![Page 67: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/67.jpg)
www.luxoft.com
Monad
f: a -> Ma g: a -> Ma h: a -> Ma
f g h => flatMap ° °
Function composition:
f: a -> Mb g: b -> Mc h: c -> Md
![Page 68: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/68.jpg)
www.luxoft.com
Monad
interface Monad<A> {
Monad<A> unit(A a);
Monad<B> flatMap(Function<A, Monad<B>> f);
}
![Page 69: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/69.jpg)
www.luxoft.com
Monad interface Monad<A> {
Monad<A> unit(A a);
Monad<B> flatMap(Function<A, Monad<B>> f);
default Monad<B> map(Function<A, B> f) {
return flatMap(v -> unit(f.apply(v)));
}
}
![Page 70: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/70.jpg)
www.luxoft.com
Monad interface Monad<A> {
Monad<A> unit(A a);
Monad<B> flatMap(Function<A, Monad<B>> f);
default Monad<B> map(Function<A, B> f) {
return flatMap(v -> unit(f.apply(v)));
}
}
Monad composition
Function application
![Page 71: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/71.jpg)
www.luxoft.com
Monad
• Hide complexity • Encapsulate implementation details • Allow composability • Increase redability • Reduce code duplication
![Page 72: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/72.jpg)
www.luxoft.com
Already in Java 8
• Optional • Stream • CompleatableFuture
![Page 73: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/73.jpg)
www.luxoft.com
Monad
![Page 74: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/74.jpg)
www.luxoft.com
Visitor
![Page 75: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/75.jpg)
www.luxoft.com
Visitor
Type: behavioral
Definition: Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
![Page 76: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/76.jpg)
www.luxoft.com
Visitor
• Rarely used pattern
• Can be replaced by pattern matching
• Reuse general implementation
![Page 77: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/77.jpg)
www.luxoft.com
Visitor
interface Visitor<T> {
T visit(Square element);
T visit(Circle element);
T visit(Rectangle element);
}
def visit(e: Element): T = e match {
case Square => do1();
case Circle => do2();
case Rectangle => do3();
}
![Page 78: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/78.jpg)
www.luxoft.com
Visitor
![Page 79: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/79.jpg)
www.luxoft.com
Paradigm shift:
• object centric -> function centric
• function composition reduce complexity
• data to code -> code to data
• external -> internal (mechanic incapsulation)
![Page 80: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/80.jpg)
www.luxoft.com
• functions • higher order function • function composition • partially applied functions • monads • pattern matching • …
New Designers Toolbox
![Page 81: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/81.jpg)
www.luxoft.com
Design Patterns communication tool rather then implementation guide
![Page 82: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/82.jpg)
www.luxoft.com
“In the book we only tell when to apply pattern, but we never talk about when to remove a pattern. Removing a pattern can simplify a system and a simple solution should almost always win. Coming up with a simple solutions is the real challenge.” E.Gamma
![Page 83: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/83.jpg)
www.luxoft.com
• no silver bullet • OOP is alive • GoF “Design Patterns” is still valid • you just have additional design tools • almost always trade-off • use your mind
And remember:
![Page 84: Java day2016 "Reinventing design patterns with java 8"](https://reader031.vdocument.in/reader031/viewer/2022021813/587ce7911a28ab564b8b4861/html5/thumbnails/84.jpg)
www.luxoft.com
Thanks!!!