рдЗрд╕ рд╣реЗрдмреНрд░рд╕реНрдЯреНрд░реЗрдЯреА рдореЗрдВ, рдСрдмреНрдЬрд░реНрд╡рд░ рдФрд░ рд▓рд┐рдВрдХрд░ рдкреИрдЯрд░реНрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХрдм рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдХрдм рд╡рд╛рд░рд┐рд╕ рдХрд░рдирд╛ рд╣реИред рдФрд░ рдпрд╣ рднреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдХреЛрдб рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рдХреНрдпрд╛ рддрд░реАрдХреЗ рдореМрдЬреВрдж рд╣реИрдВред
рд▓реЗрдЦ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдиреМрд╕рд┐рдЦрд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛, рдЬреЛ рдЕрдм рддрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╡реНрдпрд╛рдЦреНрдпрд╛рди рдореЗрдВ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рд╕реЗ рдХреЗрд╡рд▓ рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓реЗ рд╣реИрдВред (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд▓реЗрдЦ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдкрд░ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рдмрдХ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИред)
рддреЛ, рдЖрдЗрдП рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЕрд╡рд▓реЛрдХрди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред
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 рдФрд░ рдЙрд╕ рд▓реЗрдЦ рдкрд░ рдЯрд┐рдкреНрдкрдгреАред рдУрдУрдкреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЕрддреНрдпрдзрд┐рдХ рдЙрддреНрд╕рд╛рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣ рд╣рд╛рдмреНрд░рд╕реНрдЯреИрдЯрд┐рдпрд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ,
рдЗрд╕рд▓рд┐рдП рд╣рдо рдЖрдкрдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдПрдХ рдХрд╛рд░рдЦрд╛рдирд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ
рдпрд╛ рдХреИрд╕реЗ рддрдереНрдпрд╛рддреНрдордХ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП ред