рдкреНрд░реЗрдХреНрд╖рдХ рдкреИрдЯрд░реНрди: рд╢реНрд░реЛрддрд╛рдУрдВ рд╕реЗ рд╕реВрдЪрд┐рдпреЛрдВ рдФрд░ рдиреЗрд╕реНрдЯреЗрдб рдЧреБрдбрд╝рд┐рдпрд╛

рдЗрд╕ рд╣реЗрдмреНрд░рд╕реНрдЯреНрд░реЗрдЯреА рдореЗрдВ, рдСрдмреНрдЬрд░реНрд╡рд░ рдФрд░ рд▓рд┐рдВрдХрд░ рдкреИрдЯрд░реНрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХрдм рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдХрдм рд╡рд╛рд░рд┐рд╕ рдХрд░рдирд╛ рд╣реИред рдФрд░ рдпрд╣ рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреЛрдб рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рдХреНрдпрд╛ рддрд░реАрдХреЗ рдореМрдЬреВрдж рд╣реИрдВред

рд▓реЗрдЦ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдиреМрд╕рд┐рдЦрд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдЬреЛ рдЕрдм рддрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡реНрдпрд╛рдЦреНрдпрд╛рди рдореЗрдВ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╕реЗ рдХреЗрд╡рд▓ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓реЗ рд╣реИрдВред (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд▓реЗрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдмрдХ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИред)


рддреЛ, рдЖрдЗрдП рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред

interface AListener { public void aChanged(); public void bChanged(); } 


рдФрд░ рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдРрд╕реЗ рд╡рд░реНрдЧред

 class AEventSource { private List<AListener> listeners = new ArrayList<AListener>(); public void add(AListener listener) { listeners.add(listener); } private void aChanged() { for (AListener listener : listeners) { listener.aChanged(); } } private void bChanged() { for (AListener listener : listeners) { listener.bChanged(); } } public void f() { ... aChanged(); ... bChanged(); ... } ... } 


рдпрд╣рд╛рдБ, aChanged() рдФрд░ bChanged() рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ, рд╕рднреА рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдШрдЯрдирд╛ рд╣реБрдИ рд╣реИред рдФрд░ f() рд╡рд┐рдзрд┐ рдореЗрдВ, рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рд╣реА рд╕рдордп рдкрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдпрд╣ рд╕рдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдЕрд╡рд╕рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреА рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡рд┐рднрд┐рдиреНрди рдЖрджреЗрд╢реЛрдВ рдореЗрдВ рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рди рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдХрдо рд╕реЗ рдХрдо рджреЛ рд╕рдорд╛рдзрд╛рди рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рдХреБрдЫ рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝рдХрд░ AEventSource рд╡рд░реНрдЧ рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░реЗ, рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣рд░ рдЪреАрдЬ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХрдХреНрд╖рд╛ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлрд┐рд░ рд╡рд╛рдВрдЫрд┐рдд рдЕрдзрд┐рд╕реВрдЪрдирд╛ рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдирд┐рд░реНрдорд╛рдг рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╡рд╕реНрддреБ рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рджреЛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рдпрджрд┐ рд╣рдо рджреЗрдЦреЗ рдЧрдП AEventSource рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛ (рдпрд╛ рдЕрдзрд┐рдХ) рдХрдХреНрд╖рд╛рдПрдВ AEventSource1 , AEventSource2 , рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рддреЛ, рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реБрдП, рдЖрдкрдХреЛ рджреЛ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЬрдЯрд┐рд▓ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЙрдкреА рд╣реИ -рдкрд╕рдВрдж, рдпрд╛рдиреА рдмреБрд░рд╛рдИред рджреВрд╕рд░рд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реЛрдЧрд╛ рдХрд┐ рджреВрд╕рд░рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХрд▓ рдЬрд┐рдореНрдореЗрджрд╛рд░реА (рдПрд╕рдЖрд░рдкреА) рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдм AEventSource рд╡рд░реНрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рджреЛ рдХрд╛рд░рдг AEventSource : рдпрджрд┐ рд╣рдо рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреНрд░рдо рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╣рдо рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХрд╛рд░рдг рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣ рд╣реИ, рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╕реЗ f() рдлрд╝рдВрдХреНрд╢рдиред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЪреБрдирддреЗ рд╣реИрдВ - рд╣рдо рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рд╣рдо рдереЛрдбрд╝рд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддреН, рд▓рд┐рдВрдХрд░ рдкреИрдЯрд░реНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдмрд▓реНрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рднреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

 class ACompositeListener implements AListener { private List<AListener> listeners = new ArrayList<AListener>(); public void add(AListener listener) { listeners.add(listener); } @Override public void aChanged() { for (AListener listener : listeners) { listener.aChanged(); } } @Override public void bChanged() { for (AListener listener : listeners) { listener.bChanged(); } } } 


рддрдм AEventSource рд╡рд░реНрдЧ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:

 class AEventSource { private AListener listener; AEventSource(AListener listener) { this.listener = listener; } public void f() { ... listener.aChanged(); ... listener.bChanged(); ... } } 


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рд╢реНрд░реЛрддрд╛рдУрдВ рд╕реЗ рдкреВрд░реА рдЧреБрдбрд╝рд┐рдпрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

 ACompositeListener compositeListener1 = new ACompositeListener(); compositeListener1.add(new AConcreteListener1()); ACompositeListener compositeListener2 = new ACompositeListener(); compositeListener1.add(compositeListener2); compositeListener2.add(new AConcreteListener2()); compositeListener2.add(new AConcreteListener3()); AEventSource source = new AEventSource(compositeListener1); 


рд╕рдЪ рд╣реИ, рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдПрдХ рдЦрд╛рдореА рд╣реИред рдЕрд╡рд▓реЛрдХрди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рд╕рдореБрдЪреНрдЪрдп рдмрдирд╛рдиреЗ рдореЗрдВ рдЗрддрдирд╛ рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕ рддрд░рд╣ рдХреЗ рдЖрджреЗрд╢ рдФрд░ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдирд┐рдпрдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рдореБрдЪреНрдЪрдп рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред

рдФрд░ рдлрд┐рд░, рдпрд╣ рдХреЛрдб рдЕрдкрдирд╛ рдХрд╛рдо рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЪрд╛рдирдХ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ (рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкрддреНрд░ A рдХреЛ рдХреНрд▓рд╛рд╕ рдХреЗ рдирд╛рдореЛрдВ рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рдЬреЛрдбрд╝рд╛), рдЖрдкрдХреЛ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рднреА рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ AListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ AListener рдЕрд▓рд╛рд╡рд╛ рдПрдХ рдФрд░ рд╡рд┐рдзрд┐ рд╣реИ, рдЪрд▓реЛ рдЗрд╕реЗ dChanged() рдХрд╣рддреЗ рд╣реИрдВ dChanged() ред рдпрд╣реА рд╣реИ, DListener рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рджреВрд╕рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ:

 interface DListener extends AListener { public void dChanged(); } 


рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЛрдб рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рддреАрди рддрд░реАрдХреЗ рд╣реИрдВред рдпрд╣, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЙрдкреА-рдкреЗрд╕реНрдЯ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рдЕрдВрдд рдореЗрдВ, рд░рдЪрдирд╛ + рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рд╣реИред рд╣рдо рд╡реИрдЪрд╛рд░рд┐рдХ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдХреЛ рддреБрд░рдВрдд рддреНрдпрд╛рдЧ рджреЗрдВрдЧреЗред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╕рд╛рдзрд╛рд░рдг рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ DListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ DListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬреИрд╕реЗ рд╣реА рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ

 class DCompositeListener extends ACompositeListener { ... } 


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рддреБрд░рдВрдд add(AListener listener) рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ AListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди DListener рдирд╣реАрдВред рдпрджрд┐ рд╣рдо рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

 @Override public void add(DListener listener) { ... } 

рддрдм рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдХрд╣реЗрдЧрд╛: method does not override or implement a method from a supertype ( method does not override or implement a method from a supertype рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж)ред

рдареАрдХ рд╣реИ, рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЬрд╛рдВрдЪ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдЧрд░ рдЬреЛрдбрд╝рд╛ рд╡рд╕реНрддреБ DListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдВ? рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрдпреЛрдВ рди рд▓рд┐рдЦреЗрдВ
 @Override public void add(final AListener listener) { if (listener instanceof DListener) { listeners.add(listener); } else { throw new IllegalArgumentException(); } } 


рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдпрд╣ рдХреБрдЫ рдЕрдирд╛рдбрд╝реА рджрд┐рдЦрддрд╛ рд╣реИ, рдпрд╣ рдЕрднреА рднреА рд▓рд┐рд╕реНрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди (рдПрд▓рдПрд╕рдкреА рдПрдХ) рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИред рдЬрд┐рд╕реЗ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЖрдзрд╛рд░ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдп рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╡реНрдпреБрддреНрдкрдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдорд╛рд░реЛрд╣

 void g(ACompositeListener composite) { composite.add(new AConcreteListener1()); } 


рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ (рдФрд░ рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ) рдХрд┐ рдЖрдк рдПрдХ рд╢реНрд░реЛрддрд╛ рдХреЛ composite рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╣рдо g() рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ g() рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ:
 g(new DCompositeListener()); 

рдФрд░ рд╕рдм рдХреБрдЫ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рдЗрд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рднреА рдЕрд╕рдВрднрд╡ рдмрдирд╛рдирд╛ рд╣реИред

рд╣рд╛рдВ, AListener рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк, рдФрд░ рдЙрди рд╕рднреА рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдирдХреЗ рдкрд╛рд╕ dChanged() рд╡рд┐рдзрд┐ рдирд╣реАрдВ рдереА, dChanged() рдкрджреНрдзрддрд┐ рдХреЗ рдЕрдкрд╡рд╛рдж рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЦрд╛рд▓реА рдпрд╛ рдлреЗрдВрдХ рджреЗрддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ (рдЙрд░реНрдл ISP)ред

рдЗрд╕рд▓рд┐рдП, рд░рдЪрдирд╛ + рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдмрдирд╛ рд╣реБрдЖ рд╣реИред ACompositeListener рд╡рд░реНрдЧ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рдирдП ListenerList рд╡рд░реНрдЧ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ, рд╣рдЯрд╛рдиреЗ, рдФрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╕рднреА рдХреЛрдб ACompositeListener рджреЗрддреЗ рд╣реИрдВред рдФрд░ рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реНрд░реЛрддрд╛ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдорд╛рдирдХреАрдХреГрдд рд╡рд░реНрдЧ рд╣реЛрдЧрд╛ред

 class ListenerList<T> implements Iterable<T> { protected List<T> listeners = new ArrayList<T>(); public void add(T listener) { listeners.add(listener); } public void remove(T listener) { listeners.remove(listener); } public Iterator<T> iterator() { return listeners.iterator(); } } 


рдЫрд╛рддреНрд░реЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдПрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдВрдЧреАред

 class ATranslator<T extends AListener> { protected ListenerList<T> listeners; public ATranslator(ListenerList<T> listeners) { this.listeners = listeners; } public void aChanged() { for (AListener listener : listeners) { listener.aChanged(); } } public void bChanged() { for (AListener listener : listeners) { listener.bChanged(); } } } class DTranslator<T extends DListener> extends ATranslator<T> { public DTranslator(ListenerList<T> listeners) { super(listeners); } public void dChanged() { for (DListener listener : listeners) { listener.dChanged(); } } } 


рд╕реАрдорд┐рдд рдкреНрд░рдХрд╛рд░ ( <T extends XListener> ) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╢реНрд░реЛрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗред рдПрдХ рд╢реНрд░реЛрддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХреЛ рдЬрдиреНрдо рджреЗрдЧрд╛ред рд╣рдордиреЗ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ред

рдЕрдм ACompositeListener рдФрд░ ACompositeListener рдмрд╕ ACompositeListener :
 class ACompositeListener extends ListenerList<AListener> implements AListener { private ATranslator<AListener> aTranslator = new ATranslator<AListener>(this); @Override public void aChanged() { aTranslator.aChanged(); } @Override public void bChanged() { aTranslator.bChanged(); } } 


 class DCompositeListener extends ListenerList<DListener> implements DListener { private DTranslator<DListener> dTranslator = new DTranslator<DListener>(this); @Override public void aChanged() { dTranslator.aChanged(); } @Override public void bChanged() { dTranslator.bChanged(); } @Override public void dChanged() { dTranslator.dChanged(); } } 


рд╡рд╣ рд╕рдм рд╣реИред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреИрдЯрд░реНрди рдФрд░ OOP рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ GoF рдореЗрдВ рдкрдврд╝рдиреЗ рд▓рд╛рдпрдХ рдХреНрдпрд╛ рд╣реИред рдЖрдк habrastatia рдореЗрдВ Linker рдкреИрдЯрд░реНрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдбрд┐рдЬрд╝рд╛рдЗрди рдкреИрдЯрд░реНрди "Linker" / " рд╕реНрдкрд╛рдЗрдмреНрд░реЗрдЯ рд╣реИрдмреНрд░рд╛рдпрдЬрд╝рд░ " рдХрд╛ "рд╕рдордЧреНрд░" ред рдЖрдк рд╣реЙрд░реНрд╕реНрдЯрдорди рдФрд░ рдХреЙрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдХреЛрд░ рдЬрд╛рд╡рд╛ рдХреЗ рдкрд╣рд▓реЗ рдЦрдВрдб рдХреЗ 13 рд╡реЗрдВ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдирд┐рд╡рд╛рд╕ рд╕реНрдерд╛рди рдореЗрдВ рдмрд┐рд▓реНрдбрд░ рдкреИрдЯрд░реНрди рдХреЗ рд▓рд┐рдП рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдХрдХреНрд╖рд╛рдПрдВ - рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдмрд┐рд▓реНрдбрд░реНрд╕! рд╣реИрдмрд░реВрд╕рд░ gvsmirnov рдФрд░ рдЙрд╕ рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгреАред рдУрдУрдкреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрддреНрдпрдзрд┐рдХ рдЙрддреНрд╕рд╛рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣ рд╣рд╛рдмреНрд░рд╕реНрдЯреИрдЯрд┐рдпрд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрдкрдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдХреИрд╕реЗ рддрдереНрдпрд╛рддреНрдордХ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред

Source: https://habr.com/ru/post/In128827/


All Articles