рд▓реЗрдЦрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ:Pavel Fatin JetBrains рдореЗрдВ IntelliJ IDEA рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдХрд╛рд▓рд╛ рдкреНрд▓рдЧрдЗрди рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИредрдкрд░рд┐рдЪрдп
рдпрд╣ рдЖрд▓реЗрдЦ рдЙрджрд╛рд╣рд░рдг рджреЗрдЧрд╛ рдХрд┐ рдХреНрд▓рд╛рд╕рд┐рдХ
рд╕реНрдХрд╛рд▓рд╛ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд▓реЗрдЦ рдХреА рд╕рд╛рдордЧреНрд░реА
рдЬрд╛рд╡рд╛рдбрд╛рдп рд╕рдореНрдореЗрд▓рди (
рдкреНрд░рд╕реНрддреБрддрд┐ рд╕реНрд▓рд╛рдЗрдб ) рдореЗрдВ рдореЗрд░реА рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛ рдЖрдзрд╛рд░
рдмрдирддреА рд╣реИ ред
рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди
рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рд╕рдорд╛рдзрд╛рди рд╣реИред рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЬрд┐рд╕реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдкреНрд░рднрд╛рд╡реА рдбрд┐рдЬрд╛рдЗрди рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди
рдХреНрд▓рд╛рд╕рд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рд╣реИрдВред рд╡реЗ рд╡рд░реНрдЧреЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдзреЛрдВ рдФрд░ рд╕рдВрдмрдВрдзреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдпреЗ рдореЙрдбрд▓ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдХрдо рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ ("рдХрд╛рд░реНрдпрд╛рддреНрдордХ" рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП
рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕реЛрдкреЗрдбрд┐рдпрд╛ рдФрд░
рд╕реНрдХреЗрд▓рд╛рдЬрд╝ рджреЗрдЦреЗрдВ), рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЪреВрдВрдХрд┐
рд╕реНрдХрд╛рд▓рд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ-
рдлрд╝рдВрдХреНрд╢рдирд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпреЗ рдореЙрдбрд▓
рд╕реНрдХрд╛рд▓рд╛ рдХреЛрдб рдХреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реИрдВред
рдХрднреА-рдХрднреА, рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВред рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рднрд╛рд╖рд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖рдорддрд╛рдПрдВ рд╣реИрдВ, рдкреИрдЯрд░реНрди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕реНрдХрд╛рд▓рд╛ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреНрд▓рд╛рд╕рд┐рдХ рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╕реНрдХрд╛рд▓рд╛ рдХреЗ рдЕрдкрдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрдЯрд░реНрди рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдХреЗрд╡рд▓ рд╢рд╛рд╕реНрддреНрд░реАрдп рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдмреАрдЪ рдЖрдкрд╕реА рд╕рдордЭ рдХреА рдХреБрдВрдЬреА рд╣реИрдВред
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣рд╛рдВ рдкреНрд░рд╕реНрддреБрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ,
рд╕реНрдХрд╛рд▓рд╛ рднрд╛рд╖рд╛ рдХреА рдкреВрд░реА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЬрдЯрд┐рд▓ рдЪрд╛рд▓ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рддрд╛рдХрд┐
рдЬрд╛рд╡рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕реНрдХрд╛рд▓рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ, рдЗрд╕рдХреА рд╕реНрдкрд╖реНрдЯ рд╕рдордЭ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХреЗред
рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдЕрд╡рд▓реЛрдХрди
рд╡реНрдпрд╡рд╣рд╛рд░ рдкреИрдЯрд░реНрди:
рдЗрд╕рдХреЗ рдмрд╛рдж, рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╕рднреА рдХреЛрдб
рдЬреАрдердм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдкрд░ рдЙрдкрд▓рдмреНрдз
рд╣реИ )ред
рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐
рдлреИрдХреНрдЯреНрд░реА рдореЗрдердб рдкреИрдЯрд░реНрди
рдХрд╛ рдЙрдкрдпреЛрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрдгрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрд┐рд╕ рд╡рд░реНрдЧ рдХреЛ рдмрдирд╛рдирд╛ рд╣реИред
рдкреИрдЯрд░реНрди рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
- рдПрдХ рдЬрдЯрд┐рд▓ рд╡рд╕реНрддреБ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реНрдХ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░реЗрдВ,
- рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд▓рд╛рд╕ рдЪреБрдиреЗрдВ,
- рдХреИрд╢ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕
- рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░реЗрдВред
рд╕реНрдЯреЗрдЯрд┐рдХ рдлреИрдХреНрдЯреНрд░реА рдореЗрдердб рдкреИрдЯрд░реНрди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, рдЬреЛ рдХрд┐
рдлреИрдХреНрдЯреНрд░реА рдореЗрдердб рдкреИрдЯрд░реНрди рдХреЗ рдХреНрд▓рд╛рд╕рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдереЛрдбрд╝рд╛ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
ред ред
рдЬрд╛рд╡рд╛ рдореЗрдВ ,
рдирдП рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд╕реАрдзреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
public interface Animal {}
public class Dog implements Animal {}
public class Cat implements Animal {}
public class AnimalFactory { public static Animal createAnimal(String kind) { if ("cat".equals(kind)) { return new Cat(); } if ("dog".equals(kind)) { return new Dog(); } throw new IllegalArgumentException(); } }
рдПрдХ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдХреБрддреНрддрд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред
Animal animal = AnimalFactory.createAnimal("dog");
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рд╕реНрдХрд╛рд▓рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд╡рд┐рдзрд┐ рд╣реИ:
trait Animal private class Dog extends Animal private class Cat extends Animal object Animal { def apply(kind: String) = kind match { case "dog" => new Dog() case "cat" => new Cat() } }
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
Animal("dog")
рдлреИрдХреНрдЯреНрд░реА рдкрджреНрдзрддрд┐ рдХреЛ рддрдерд╛рдХрдерд┐рдд "рд╕рд╛рдереА рд╡рд╕реНрддреБ" рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЧрд▓рдЯрди рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рд╕рдорд╛рди рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╕рдорд╛рди рдирд╛рдо рдХреЗ рд╕рд╛рде рд╣реИред рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреИрдЯрд░реНрди рдХреЗ "рд╕реНрдерд┐рд░" рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддрдХ рд╕реАрдорд┐рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдк-рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реМрдВрдкрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдкреЗрд╢реЗрд╡рд░реЛрдВ:
- рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рдирд╛рдо рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
- рдорд╛рдирдХ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрддред
- рдбрд┐рдЬрд╛рдЗрдирд░ рдХреА рдПрдХ рдХреЙрд▓ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИред
рд╡рд┐рдкрдХреНрд╖:
- "рд╕реНрдЯреЗрдЯрд┐рдХ" рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ред
рдЖрд▓рд╕реА рдЖрд░рдВрднреАрдХрд░рдг
рдЖрд╕реНрдердЧрд┐рдд рдЖрд░рдВрднреАрдХрд░рдг рдЖрд╕реНрдердЧрд┐рдд рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред рдпрд╣ рдкреИрдЯрд░реНрди рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдкрд╣реБрдВрдЪ рдореЗрдВ рдПрдХ рдореВрд▓реНрдп (рдпрд╛ рд╡рд╕реНрддреБ) рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдХреБрдЫ рдорд╣рдВрдЧреА рдЧрдгрдирд╛рдУрдВ рдХреЛ рдЯрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ)ред
рдЖрдорддреМрд░ рдкрд░,
рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╡рд┐рд╢реЗрд╖
рдирд▓ рдореВрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдЕрд╕рдВрдЧрдард┐рдд рд░рд╛рдЬреНрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдпрджрд┐
рд╢реВрдиреНрдп рдПрдХ рдорд╛рдиреНрдп рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реНрдб рд╡реИрд▓реНрдпреВ рд╣реИ, рддреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╕реНрдЯреЗрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрд╡рдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХреЛрдб рдореЗрдВ, рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдзреНрд╡рдЬ рддрдХ рдкрд╣реБрдВрдЪ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмреЗрд╣рддрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдбрдмрд▓-рдЪреЗрдХ рд▓реЙрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЖрдЧреЗ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИред
private volatile Component component; public Component getComponent() { Component result = component; if (result == null) { synchronized(this) { result = component; if (result == null) { component = result = new Component(); } } } return result; }
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
Component component = getComponent();
рд╕реНрдХрд╛рд▓рд╛ рдПрдХ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрдВрддрд░реНрдирд┐рд░реНрдорд┐рдд рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
lazy val x = { print("(computing x) ") 42 }
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
print("x = ") println(x)
рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рд╡рд┐рд▓рдВрдмрд┐рдд рдЖрд░рдВрднреАрдХрд░рдг
рд╢реВрдиреНрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓рдВрдмрд┐рдд рдореВрд▓реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рд▓рдШреБ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ред
- рдЕрд╢рдХреНрдд рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╢рдХреНрдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- рд▓рдВрдмрд┐рдд рдорд╛рди рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрдВред
рд╡рд┐рдкрдХреНрд╖
- рдЖрд░рдВрднреАрдХрд░рдг рдкрд░ рдХрдо рдирд┐рдпрдВрддреНрд░рдгред
рд╕рд┐рдВрдЧрд▓рдЯрди (рд╕рд┐рдВрдЧрд▓рдЯрди)
рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рд╡рд╕реНрддреБ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдкрд╣реБрдВрдЪ рдмрд┐рдВрджреБ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд╕рд┐рдВрдЧрд▓рдЯрди, рд╢рд╛рдпрдж
рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рдмрд╕реЗ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди рд╣реИ, рдЬреЛ рднрд╛рд╖рд╛ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрдорд╛рдг рдХреА рдХрдореА рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреЗрдд рд╣реИред
рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреАрд╡рд░реНрдб
рд╕реНрдерд┐рд░ рд╣реИ , рдЬреЛ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ (рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг) рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХреА рдХрдореА рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ; рдЗрд╕ рдХреАрд╡рд░реНрдб рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рддрд░реАрдХреЗ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рджреМрд░рд╛рди рдУрд╡рд░рд░рд╛рдЗрдб рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗред рдЗрд╕ рддрд░рд╣ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдореВрд▓ OOP рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдЪрд▓рддреА рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдПрдХ рд╡рд╕реНрддреБ рд╣реИред
рддреЛ, рдЗрд╕ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдХреБрдЫ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрддрд╛ рд╣реИ (рд╕рдВрднрд╡рддрдГ рд╡рд┐рд▓рдВрдмрд┐рдд рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд╕рд╛рде)ред
public class Cat implements Runnable { private static final Cat instance = new Cat(); private Cat() {} public void run() {
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
Cat.getInstance().run()
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреИрдЯрд░реНрди рдХреЗ рдЕрдзрд┐рдХ рдЕрдиреБрднрд╡реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рд╡рд┐рд▓рдВрдмрд┐рдд рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд╕рд╛рде) рдХреЛ рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
"рдбрдмрд▓ рдЪреЗрдХ рдХреЗ рд╕рд╛рде рдмреНрд▓реЙрдХ" )ред
рд╕реНрдХрд╛рд▓рд╛ рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдореИрдХреЗрдирд┐рдЬреНрдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
object Cat extends Runnable { def run() {
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
Cat.run()
рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ, рд╡рд╕реНрддреБрдПрдВ рдХрдХреНрд╖рд╛рдУрдВ рдпрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╕реАрдзреЗ рдпрд╛ рдПрдХ рд╡рд┐рд░рд╛рд╕рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред
рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ , рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдорд╛рдВрдЧ рдкрд░ рдЖрд╕реНрдердЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рдкрд╛рд░рджрд░реНрд╢реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
- рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ред
- рд╡рд┐рд▓рдВрдмрд┐рдд рдЖрд░рдВрднреАрдХрд░рдгред
- рдзрд╛рдЧрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИред
рд╡рд┐рдкрдХреНрд╖
- рдЖрд░рдВрднреАрдХрд░рдг рдкрд░ рдХрдо рдирд┐рдпрдВрддреНрд░рдгред
рдЕрдиреБрдХреВрд▓рдХ
рдПрдбреЗрдкреНрдЯрд░ рдкреИрдЯрд░реНрди рдПрдХ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рджреВрд╕рд░реЗ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдореМрдЬреВрджрд╛ рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдбреЗрдкреНрдЯрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред
рдЬрд╛рд╡рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдПрдХ рд░реИрдкрд░ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдирд╛ рд╣реИ рдЬреЛ рдХреЛрдб рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
public interface Log { void warning(String message); void error(String message); } public final class Logger { void log(Level level, String message) { } } public class LoggerToLogAdapter implements Log { private final Logger logger; public LoggerToLogAdapter(Logger logger) { this.logger = logger; } public void warning(String message) { logger.log(WARNING, message); } public void error(String message) { logger.log(ERROR, message); } }
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
Log log = new LoggerToLogAdapter(new Logger());
рд╕реНрдХреИрд▓рд╛ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рддрдВрддреНрд░ рд╣реИ рдЬреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдЧред
trait Log { def warning(message: String) def error(message: String) } final class Logger { def log(level: Level, message: String) { } } implicit class LoggerToLogAdapter(logger: Logger) extends Log { def warning(message: String) { logger.log(WARNING, message) } def error(message: String) { logger.log(ERROR, message) } }
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
val log: Log = new Logger()
рдпрджреНрдпрдкрд┐
рд▓реЙрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ,
рд╕реНрдХрд╛рд▓рд╛ рд╕рдВрдХрд▓рдХ
рд▓реЙрдЧрдЧрд░ рд╡рд░реНрдЧ рдХреЛ рддреБрд░рдВрдд рдмрджрд▓ рджреЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдПрдХ рдПрдбрд╛рдкреНрдЯрд░ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯ рджреЗрдЧрд╛ред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рдкрд╛рд░рджрд░реНрд╢реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
- рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ред
рд╡рд┐рдкрдХреНрд╖
- рдЖрдк рдПрдХ рдЖрдИрдбреАрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдбреЗрдХреЛрд░реЗрдЯрд░ (рдбреЗрдХреЛрд░реЗрдЯрд░)
рдбреЗрдХреЛрд░реЗрдЯрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕реА рд╡рд░реНрдЧ рдХреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбреЗрдХреЛрд░реЗрдЯрд░ рд╡рд┐рд░рд╛рд╕рдд рдХрд╛ рдПрдХ рд▓рдЪреАрд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреИрдЯрд░реНрди рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╕реНрд╡рддрдВрддреНрд░ рддрд░реАрдХреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЬрдм
рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
рд╣реИ , рддреЛ рдПрдХ рдирдпрд╛ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрдзрд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдореВрд▓ рд╡рд░реНрдЧ рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХрдИ рд╕рдЬреНрдЬрд╛рдХрд╛рд░реЛрдВ рдХреЛ рдиреЗрд╕реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдХрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
public interface OutputStream { void write(byte b); void write(byte[] b); } public class FileOutputStream implements OutputStream { } public abstract class OutputStreamDecorator implements OutputStream { protected final OutputStream delegate; protected OutputStreamDecorator(OutputStream delegate) { this.delegate = delegate; } public void write(byte b) { delegate.write(b); } public void write(byte[] b) { delegate.write(b); } } public class BufferedOutputStream extends OutputStreamDecorator { public BufferedOutputStream(OutputStream delegate) { super(delegate); } public void write(byte b) {
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
new BufferedOutputStream(new FileOutputStream("foo.txt"));
рдПрдХ рд╣реА рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
рд╕реНрдХрд╛рд▓рд╛ рдЕрдкрдиреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдмрдВрдзреЗ рдмрд┐рдирд╛, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕реАрдзрд╛ рддрд░реАрдХрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
trait OutputStream { def write(b: Byte) def write(b: Array[Byte]) } class FileOutputStream(path: String) extends OutputStream { } trait Buffering extends OutputStream { abstract override def write(b: Byte) {
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
new FileOutputStream("foo.txt") with Buffering
рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрди рд╕рдВрдХрд▓рд┐рдд рд╕рдордп рдкрд░ рд╡рд┐рдзрд┐рд╡рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рддрдм рддрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рддрдХ рд╣рдо рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЙрд╕ рд╕рдордп рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдВрд░рдЪрдирд╛-рдЖрдзрд╛рд░рд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╕реНрдХрд╛рд▓рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╡рд╕реНрддреБ рдХреА рдкрд╣рдЪрд╛рди рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╕рдЬрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░
рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ, рдЗрд╕ рд╕рдЬрд╛рд╡рдЯ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ
рд╕реНрдЯреИрдХреЗрдмрд▓ рдЯреНрд░реЗрдЯ рдкреИрдЯрд░реНрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рдкрд╛рд░рджрд░реНрд╢реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
- рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ред
- рд╡рд╕реНрддреБрдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдмрдЪрд╛рдИ рдЧрдИ рд╣реИред
- рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдХрд╛ рдЕрднрд╛рд╡ред
- рдордзреНрдпрд╡рд░реНрддреА рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЕрднрд╛рд╡ред
рд╡рд┐рдкрдХреНрд╖
- рд╕реНрдереИрддрд┐рдХ рдмрдВрдзрдиред
- рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдирд┐рд░реНрдорд╛рддрд╛ред
рдорд╛рди рд╡рд╕реНрддреБ
рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдЫреЛрдЯрд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдорд╛рди рд╣реИред рдпрджрд┐ рдЙрдирдХреЗ рд╕рднреА рдлрд╝реАрд▓реНрдб рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдорд╛рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдорд╛рди рд╣реИрдВред рд╕рдВрдЦреНрдпрд╛, рджрд┐рдирд╛рдВрдХ, рд░рдВрдЧ рдЖрджрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореВрд▓реНрдп рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреЙрд░реНрдкреЛрд░реЗрдЯ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ, рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП
рдбреАрдЯреАрдУ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рдХреЗ рдХрд╛рд░рдг, рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдореВрд▓реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддреЗ рд╣реИрдВред
рдореВрд▓реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП
рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдирд╣реАрдВ рд╣реИ; рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рдЧреЗрдЯрд░ рддрд░реАрдХреЛрдВ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реАрдХреЛрдВ (рдмрд░рд╛рдмрд░, рд╣реИрд╢рдХреЛрдб, рд╕реНрдЯреНрд░реАрдВрдЧ) рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
public class Point { private final int x, y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } public boolean equals(Object o) {
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
Point point = new Point(1, 2)
рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ , рдЖрдк рдореВрд▓реНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрдкрд▓реНрд╕ рдпрд╛ рдХреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬрдм рдПрдХ рдЕрд▓рдЧ рдХреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЯреНрдпреВрдкрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
val point = (1, 2)
рдЯрдкреНрд▓реНрд╕ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп "рд╕рдВрдЧреНрд░рд╣" рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдЯреНрдпреВрдкрд▓реНрд╕ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдЧреЗрдЯреНрдЯрд░ рдореЗрдердб рдФрд░ рд╕рднреА рд╣реЗрд▓реНрдкрд░ рдореЗрдердб рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
type Point = (Int, Int)
рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдПрдХ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╡рд░реНрдЧ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдпрд╛ рдЬрдм рдбреЗрдЯрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд░реНрдгрдирд╛рддреНрдордХ рдирд╛рдо рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдХреЗрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
case class Point(x: Int, y: Int) val point = Point(1, 2)
рдХреЗрд╕ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЧреБрдг рдмрдирд╛рддреЗ рд╣реИрдВред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХреЗрд╕ рдХрдХреНрд╖рд╛рдПрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред рдЯреНрдпреВрдкрд▓реНрд╕ рдХреА рддрд░рд╣, рд╡реЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдорд╛рдорд▓реЗ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд╡реИрдз рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рд╕рд╛рдзрд╛рд░рдг рдХрдХреНрд╖рд╛рдУрдВ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдирд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ)ред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ред
- рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдЯреБрдкрд▓реНрд╕ рд╣реИрдВред
- рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЗред
рд╡рд┐рдкрдХреНрд╖
рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИрдВред
рдЕрд╢рдХреНрдд рд╡рд╕реНрддреБрдПрдБ
рдПрдХ рдЕрд╢рдХреНрдд рд╡рд╕реНрддреБ рдПрдХ рдирд┐рд╖реНрдкрдХреНрд╖, "рдирд┐рд╖реНрдХреНрд░рд┐рдп" рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╡рд╕реНрддреБ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рд╣реИред
рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг
рдЕрд╢рдХреНрдд рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдкреВрд░реНрд╡рддрд╛ рд▓реЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдВрдХ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдЬрд╛рд╡рд╛ рдореЗрдВ, рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди "рдЦрд╛рд▓реА" рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЙрдкрд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ:
public interface Sound { void play(); } public class Music implements Sound { public void play() { } } public class NullSound implements Sound { public void play() {} } public class SoundSource { public static Sound getSound() { return available ? music : new NullSound(); } } SoundSource.getSound().play();
рдЕрдм рдЬрдм
рдкреНрд▓реЗ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реА рдХреЙрд▓ рд╕реЗ рдкрд╣рд▓реЗ
рдЧреЗрдЯрд╕рд╛рдЙрдВрдб рд╡рд┐рдзрд┐ рдХреЛ
рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдкреНрд░рд╛рдкреНрдд рд▓рд┐рдВрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЕрд╢рдХреНрдд рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Scala рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд
рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╡реИрдХрд▓реНрдкрд┐рдХ рдореВрд▓реНрдп рдХреЗ "рдХрдВрдЯреЗрдирд░" рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
trait Sound { def play() } class Music extends Sound { def play() { } } object SoundSource { def getSound: Option[Sound] = if (available) Some(music) else None } for (sound <- SoundSource.getSound) { sound.play() }
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдкреНрд░рдХрд╛рд░ред
- рд╕реНрдкрд╖реНрдЯ рдкрд░реНрдпрд╛рдпред
- рд╡реИрдХрд▓реНрдкрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рднрд╛рд╖рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдгред
рд╡рд┐рдкрдХреНрд╖
- рд╢рдмреНрджрд╛рдбрдВрдмрд░ред
рд░рдгрдиреАрддрд┐ (рд░рдгрдиреАрддрд┐)
рд░рдгрдиреАрддрд┐ рдкреИрдЯрд░реНрди рдПрдиреНрдХреИрдкреНрд╕реБрд▓реЗрдЯреЗрдб рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдПрдХ рдкрд░рд┐рд╡рд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рд░рдирдЯрд╛рдЗрдо рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЬрд╛рд╡рд╛ рдореЗрдВ , рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдзрд╛рд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рджреЗрдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреА рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдХрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ:
public interface Strategy { int compute(int a, int b); } public class Add implements Strategy { public int compute(int a, int b) { return a + b; } } public class Multiply implements Strategy { public int compute(int a, int b) { return a * b; } } public class Context { private final Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void use(int a, int b) { strategy.compute(a, b); } } new Context(new Multiply()).use(2, 3);
рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдкреНрд░рдердо рд╢реНрд░реЗрдгреА рдХреЗ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдкреИрдЯрд░реНрди рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
type Strategy = (Int, Int) => Int class Context(computer: Strategy) { def use(a: Int, b: Int) { computer(a, b) } } val add: Strategy = _ + _ val multiply: Strategy = _ * _ new Context(multiply).use(2, 3)
рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╣рд╛рдВ рд░рдгрдиреАрддрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдХрдИ рд╡рд┐рдзрд┐рдпрд╛рдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЖрдк рдХреЗрд╕ рдХрдХреНрд╖рд╛рдУрдВ рдпрд╛ рд╕рдореВрд╣ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрдкрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ред
рд╡рд┐рдкрдХреНрд╖
- рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрдиред
рдХрдорд╛рди (рдХрдорд╛рди)
рдкреИрдЯрд░реНрди рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рджреВрд░рд╕реНрде рд╕рдордп рдкрд░ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдирдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо, рд╡рд╣ рд╡рд╕реНрддреБ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рд╡рд┐рдзрд┐ рд╣реИ, рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдЬрд╛рд╡рд╛ рдореЗрдВ, рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рдХреЙрд▓ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрдЯрд░реНрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрддрд╛ рд╣реИред
public class PrintCommand implements Runnable { private final String s; PrintCommand(String s) { this.s = s; } public void run() { System.out.println(s); } } public class Invoker { private final List<Runnable> history = new ArrayList<>(); void invoke(Runnable command) { command.run(); history.add(command); } } Invoker invoker = new Invoker(); invoker.invoke(new PrintCommand("foo")); invoker.invoke(new PrintCommand("bar"));
рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдЖрд╕реНрдердЧрд┐рдд рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрдВрддреНрд░ рд╣реИ:
object Invoker { private var history: Seq[() => Unit] = Seq.empty def invoke(command: => Unit) {
рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдпрд╛ рдХреЛрдб рдХреЗ рдмреНрд▓реЙрдХ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рд┐рдВрдЯрд▓рд╛рдЗрди рд╡рд┐рдзрд┐ рдХреА рдХреЙрд▓ рд╡рд┐рдзрд┐ рдХреЗ рдЗрдирд╡реЛрдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░
рдЗрддрд┐рд╣рд╛рд╕ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ред
рд╡рд┐рдкрдХреНрд╖
- рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрдиред
рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛
рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдкреИрдЯрд░реНрди рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЕрдкрдиреЗ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреНрд░реЗрд╖рдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХрдИ рд╕рдВрд╕реНрдерд╛рдПрдВ рдЕрдиреБрд░реЛрдз рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдЕрдиреБрд░реЛрдз рдХреЛ рддрдм рддрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХреЛрдИ рд╡рд╕реНрддреБ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИред
рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдЯрд░реНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдЪреЗрди рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рдмреЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЪреЗрди рдореЗрдВ рдЕрдЧрд▓реА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЕрдиреБрд░реЛрдз (рдФрд░ рдмреАрдЪ рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдЕрдЧрд▓реЗ рд╣реИрдВрдбрд▓рд░ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
public abstract class EventHandler { private EventHandler next; void setNext(EventHandler handler) { next = handler; } public void handle(Event event) { if (canHandle(event)) doHandle(event); else if (next != null) next.handle(event); } abstract protected boolean canHandle(Event event); abstract protected void doHandle(Event event); } public class KeyboardHandler extends EventHandler {
рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:
KeyboardHandler handler = new KeyboardHandler(); handler.setNext(new MouseHandler());
рд╕реНрдХреИрд▓рд╛ рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН
рдЖрдВрд╢рд┐рдХ рдХрд╛рд░реНрдп ред рдПрдХ рдЖрдВрд╢рд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдмрд╕реЗрдЯ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐
isDefinedAt рдФрд░
рд▓рд╛рдЧреВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣
getOrElse рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛
case class Event(source: String) type EventHandler = PartialFunction[Event, Unit] val defaultHandler: EventHandler = PartialFunction(_ => ()) val keyboardHandler: EventHandler = { case Event("keyboard") => } def mouseHandler(delay: Int): EventHandler = { case Event("mouse") => }
keyboardHandler.orElse(mouseHandler(100)).orElse(defaultHandler)
рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ "рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд" рдШрдЯрдирд╛рдУрдВ рдкрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП
рдбрд┐рдлрд╝реЙрд▓реНрдЯрд╣реИрдВрдбрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ
рдпрд╣рд╛рдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛
рд╣реИ ред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ред
- рдирд┐рд░реНрдорд┐рдд рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгред
рд╡рд┐рдкрдХреНрд╖
- рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрдиред
рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди
рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрдЯрд░реНрди рд░рди-рдЯрд╛рдЗрдо рдкрд░ рдпрд╛ рд╕рдВрдХрд▓рди рдХреЗ рд╕рдордп рд╣рд╛рд░реНрдб-рдХреЛрдбреЗрдб рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рд╡рд┐рдХрд▓реНрдк рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред рдПрдХ рдкреИрдЯрд░реНрди
рдХрдВрдЯреНрд░реЛрд▓ рдСрдл рдХрдВрдЯреНрд░реЛрд▓ (IoC) рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ рд╣реИред
рдбрд┐рдкреЗрдВрдбреЗрдВрд╕реА рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдШрдЯрдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛
рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП
рдирдХрд▓реА рдШрдЯрдХ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред
рдЖрдИрдУрд╕реА рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкреИрдЯрд░реНрди рдХреЛ
рдЬрд╛рд╡рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдВрдЯрд░рдлреЗрд╕ (рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИред
public interface Repository { void save(User user); } public class DatabaseRepository implements Repository { } public class UserService { private final Repository repository; UserService(Repository repository) { this.repository = repository; } void create(User user) {
рд░рдЪрдирд╛
("рдПрдЪрдПрдПрд╕-рдП") рдФрд░ рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо
("рдЖрдИрдПрд╕-рдП") рдХреЗ рдЕрд▓рд╛рд╡рд╛ ,
рд╕реНрдХрд╛рд▓рд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ рд╕рдВрдмрдВрдз рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - рдЖрд╡рд╢реНрдпрдХрддрд╛
("рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ-рдП") , рдЬреЛ
рд╕реНрд╡-рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕реНрд╡-рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдХреЗ рдЖрд╡реЗрджрди рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдЖрдк рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рд▓рдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде
рд╕реНрд╡-рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
trait Repository { def save(user: User) } trait DatabaseRepository extends Repository { } trait UserService { self: Repository =>
рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдХреЗрдХ рдкреИрдЯрд░реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ;
рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЕрдиреНрдп рддрд░реАрдХреЗ рднреА рд╣реИрдВред
рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐
рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ
рд▓рдХреНрд╖рдгреЛрдВ рдХрд╛ "рдорд┐рд╢реНрд░рдг" рд╕реНрдерд┐рд░ рд╣реИ, рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЗрддрдиреА рдмрд╛рд░ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдФрд░ рд╕рдВрдХрд▓рди рдЪрд░рдг рдкрд░ рд╕реНрдереИрддрд┐рдХ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рднреЛрдВ рдХрд╛ XML рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рд╣реЛрддрд╛ рд╣реИред
рдЖрдХрд░реНрд╖рдг рдЖрддреЗ рд╣реИрдВ
- рдкрд╛рд░рджрд░реНрд╢реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред
- рдХреЙрдореНрдкреИрдХреНрдЯ рд╕рд┐рдВрдЯреИрдХреНрд╕ред
- рд╕рдВрдХрд▓рди рд╕рдордп рдкрд░ рд╕реНрдереИрддрд┐рдХ рдЬрд╛рдБрдЪред
рд╡рд┐рдкрдХреНрд╖
- рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рд╡рд┐рдиреНрдпрд╛рд╕ред
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреНрд░рд┐рдпрд╛ рдмрди рд╕рдХрддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдбреЗрдореЛ
рдЬрд╛рд╡рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЛ
рд╕реНрдХрд╛рд▓рд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреА рдЦрд╛рдИ рдХреЛ рдкрд╛рдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдФрд░
рд╕реНрдХрд╛рд▓рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬреНрдЮрд╛рдд рд╕рд╛рд░ рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред