Analisis perbandingan contoh corak pemerhati dan delegasi di Jawa
Latar belakang pengekodan
Sebuah kelas, ada dua jenis pelajar, jenis A: tidak belajar, bermain, tetapi bermain perkara yang berbeza, ada yang bermain permainan, Ada yang menonton TV
Kategori B: pelajar yang berkawal untuk memerhatikan pergerakan guru dan memaklumkan kepada semua orang dengan segera sekiranya guru masuk ke kelas.
Dengan cara ini, permintaan telah dibentuk. Pelajar penjaga harus memberitahu semua pelajar yang bermain bahawa guru akan datang, dan pelajar yang berbeza mempunyai reaksi yang berbeza serta-merta, dan ada yang berhenti bermain permainan.
Corak Pemerhati
Pengenalan
Corak Pemerhati: Mentakrifkan hubungan pergantungan satu-dengan-banyak, membenarkan berbilang objek pemerhati Memantau objek topik.
Objek topik ini akan memberitahu semua objek pemerhati apabila keadaannya berubah, membolehkan mereka mengemas kini sendiri secara automatik.
Terutamanya menyelesaikan: Masalah memberitahu objek lain tentang perubahan status satu objek, dan mengambil kira kemudahan penggunaan dan gandingan rendah untuk memastikan tahap kerjasama yang tinggi.
Bila hendak digunakan: Apabila keadaan objek (objek sasaran) berubah, semua objek bergantung (objek pemerhati) akan dimaklumkan dan pemberitahuan siaran akan dibuat.
Cara menyelesaikan: Menggunakan teknologi berorientasikan objek, kebergantungan ini boleh dilemahkan.
Kod kunci: Terdapat ArrayList dalam kelas abstrak untuk menyimpan pemerhati.
Pelaksanaan
Pemerhati (pelajar)
/** * 抽象的观察者 * * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/10 - 15:32 */ public interface Observer { public abstract void updateState(); } /** * 具体的观察者 * * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/10 - 15:39 */ public class ConcreteObserver implements Observer{ //观察者的姓名 private String name; //观察者的状态 private String observerState; //明确具体的通知者 private ConcreteSubject subject; //get set方法省略 public ConcreteObserver(String name, ConcreteSubject subject) { this.name = name; this.subject = subject; } @Override public void updateState() { observerState=subject.getSubjectState(); System.out.println(name+"在打游戏"); String str=String.format("观察者%s的:新状态是%s", name,observerState); System.out.println(str); } } /** * 具体的观察者 * * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/10 - 15:39 */ public class ConcreteObserver2 implements Observer{ //观察者的姓名 private String name; //观察者的状态 private String observerState; //明确具体的通知者 private ConcreteSubject subject; //get set方法省略 public ConcreteObserver2(String name, ConcreteSubject subject) { this.name = name; this.subject = subject; } @Override public void updateState() { observerState=subject.getSubjectState(); System.out.println(name+"在看电视"); String str=String.format("观察者%s:新状态是%s", name,observerState); System.out.println(str); } }
Pemberitahu (guru)
/** * 抽象的通知者 * * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/10 - 15:30 */ public abstract class Subject { //管理观察者的集合 private List<Observer> observers=new ArrayList<>(); //增加观察者 public void add(Observer observer){ observers.add(observer); } //减少观察者 public void detach(Observer observer){ observers.remove(observer); } /** * 通知所有的观察者 */ public void notifyMsg(){ for (Observer observer : observers) { observer.updateState(); } } } /** * 具体的通知者 * * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/10 - 15:38 */ public class ConcreteSubject extends Subject { //通知者的状态 private String subjectState; //get set方法 public String getSubjectState() { return subjectState; } public void setSubjectState(String subjectState) { this.subjectState = subjectState; } }
Kaedah utama
/** * 控制台Main方法 * * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/10 - 15:48 */ public class MainTest { public static void main(String[] args) { //创建一个主题/通知者 ConcreteSubject subject=new ConcreteSubject(); //new出观察者(学生) ConcreteObserver studentZhang = new ConcreteObserver("小张", subject); ConcreteObserver studentLiu = new ConcreteObserver("小刘", subject); ConcreteObserver studentWang = new ConcreteObserver("小王", subject); //将观察者添加到通知队列里 subject.add(studentZhang); subject.add(studentLiu); subject.add(studentWang); //通知者(老师)状态修改,通知每个学生 subject.setSubjectState("老师回来了,我要好好学习"); subject.notifyMsg(); System.out.println("-----------"); } }
Pengenalan kepada perwakilan
Delegasi boleh dianggap sebagai abstraksi fungsi dan "kelas" fungsi. Contoh perwakilan akan mewakili fungsi tertentu
Perwakilan boleh membawa berbilang kaedah dan semua kaedah dipanggil dalam urutan. Kaedah yang dibawa oleh objek perwakilan tidak perlu tergolong dalam kelas yang sama.
Model acara yang diwakilkan boleh ditakrifkan oleh tiga komponen: acara, sumber acara dan pendengar acara.
Pelaksanaan delegasi hanya dilaksanakan menggunakan refleksi.
Melaksanakan
Pemerhati
/** * 监听器/观察者 玩游戏 * 事件监听器 * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/8 - 11:17 */ public class PlayingGameListener { public PlayingGameListener(){ System.out.println("我正在玩游戏 开始时间"+new Date()); } public void stopPlayingGame(Date date){ System.out.println("老师来了,快回到座位上,结束时间"+date); } } /** * 监听器/观察者 看电视 * 事件监听器 * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/8 - 11:17 */ public class WatchingTVListener { public WatchingTVListener(){ System.out.println("我正在看电视 "+new Date()); } public void stopWatchingTV(Date date){ System.out.println("老师来了,快关闭电视 。 结束时间"+date); } }
Pemberitahu
/** * 通知者的抽象类 * 事件源 * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/8 - 11:15 */ public abstract class Notifier { //每个通知者都有一个需要通知的队列(通知:对象、方法、参数) private EventHandler eventHandler=new EventHandler(); public EventHandler getEventHandler() { return eventHandler; } public void setEventHandler(EventHandler eventHandler) { this.eventHandler = eventHandler; } //增加需要帮忙放哨的学生 public abstract void addListener(Object object,String methodName,Object...args); //告诉所有要帮忙放哨的学生:老师来了 public abstract void notifyX(); } /** * 通知者的子类,放哨人 * 事件源 * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/8 - 11:15 */ public class GoodNotifier extends Notifier { @Override public void addListener(Object object, String methodName, Object...args) { System.out.println("有新的同学委托尽职尽责的放哨人!"); this.getEventHandler().addEvent(object, methodName, args); } @Override public void notifyX() { System.out.println("尽职尽责的放哨人告诉所有需要帮忙的同学:老师来了"); try{ //优化:异步通知 this.getEventHandler().notifyX(); }catch(Exception e){ e.printStackTrace(); } } }
Acara
/** * 抽象出的事件类,也可以称为方法类 * 事件 * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/8 - 11:03 */ public class Event { //要执行方法的对象 private Object object; //要执行的方法名称 private String methodName; //要执行方法的参数 private Object[] params; //要执行方法的参数类型 private Class[] paramTypes; //若干setter getter public Object getObject() { return object; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public Object[] getParams() { return params; } public void setParams(Object[] params) { this.params = params; } public Class[] getParamTypes() { return paramTypes; } public void setParamTypes(Class[] paramTypes) { this.paramTypes = paramTypes; } public Event(){ } public Event(Object object,String methodName,Object...args){ this.object=object; this.methodName=methodName; this.params=args; contractParamTypes(this.params); } //根据参数数组生成参数类型数组 private void contractParamTypes(Object[] params){ this.paramTypes=new Class[params.length]; for(int i=0;i<params.length;i++){ this.paramTypes[i]=params[i].getClass(); } } //执行该 对象的该方法 public void invoke() throws Exception{ //通过class,method,paramTypes 确定执行哪个类的哪个方法 Method method=object.getClass().getMethod(this.getMethodName(), this.getParamTypes()); if(null==method){ return; } //方法执行 method.invoke(this.getObject(), this.getParams()); } }
Pengendalian acara
>/** * 管理哪些事件需要执行 * 管理事件 * * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/8 - 11:03 */ public class EventHandler { //是用一个List private List<Event> objects; //添加某个对象要执行的事件,及需要的参数 public void addEvent(Object object,String methodName,Object...args){ objects.add(new Event(object,methodName,args)); } public EventHandler(){ objects=new ArrayList<Event>(); } //通知所有的对象执行指定的事件 public void notifyX() throws Exception{ for(Event e : objects){ e.invoke(); } } }
Kaedah utama
/** * 启动类 * * @author Promsing(张有博) * @version 1.0.0 * @since 2022/5/8 - 11:19 */ public class EventMain { public static void main(String[] args) { //创建一个尽职尽责的放哨者 Notifier goodNotifier = new GoodNotifier(); //创建一个玩游戏的同学,开始玩游戏 PlayingGameListener playingGameListener = new PlayingGameListener(); //创建一个看电视的同学,开始看电视 WatchingTVListener watchingTVListener = new WatchingTVListener(); //玩游戏的同学告诉放哨的同学,老师来了告诉一下 goodNotifier.addListener(playingGameListener, "stopPlayingGame", new Date()); //看电视的同学告诉放哨的同学,老师来了告诉一下 goodNotifier.addListener(watchingTVListener, "stopWatchingTV", new Date()); try { //一点时间后 Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } //老师出现,放哨的人通知所有要帮忙的同学:老师来了 goodNotifier.notifyX(); } }
Ringkasan
1. Mula-mula corak pemerhati dan kemudian teknologi acara yang diwakilkan
2 mod hanya boleh memberitahu subkelas yang mewarisi kelas Observer, atau anda boleh menukar Observer kepada antara muka
for (Observer observer : observers) { observer.updateState(); }
3. Perwakilan boleh memberitahu mana-mana kaedah mana-mana kelas. Refleksi, everone
Method method=object.getClass().getMethod(this.getMethodName(), this.getParamTypes()); if(null==method){ return; } method.invoke(this.getObject(), this.getParams());
4 Perwakilan mempunyai satu lagi pelaksana acara daripada pemerhati, memisahkan pemerhati dan pemberi maklumat, dan boleh memberitahu sebarang kaedah tentang sebarang objek. Biarkan pelajar jenis A dan pelajar jenis B dipisahkan sepenuhnya, iaitu jenis A tidak mengenali pelajar jenis B langsung, tetapi boleh memberitahu pelajar jenis B
6. Wujudkan mekanisme pencetus, anda boleh menggunakan pemberitahuan tak segerak
7. Pemerhati/wakil adalah agak serupa dengan penerbitan langganan dalam MQ. Pengeluar, barisan, pengguna.
Atas ialah kandungan terperinci Analisis perbandingan contoh corak pemerhati dan delegasi di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Penjana Nombor Rawak di Jawa. Di sini kita membincangkan Fungsi dalam Java dengan contoh dan dua Penjana berbeza dengan contoh lain.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Java ialah bahasa pengaturcaraan popular yang boleh dipelajari oleh pembangun pemula dan berpengalaman. Tutorial ini bermula dengan konsep asas dan diteruskan melalui topik lanjutan. Selepas memasang Kit Pembangunan Java, anda boleh berlatih pengaturcaraan dengan mencipta program "Hello, World!" Selepas anda memahami kod, gunakan gesaan arahan untuk menyusun dan menjalankan program, dan "Hello, World!" Pembelajaran Java memulakan perjalanan pengaturcaraan anda, dan apabila penguasaan anda semakin mendalam, anda boleh mencipta aplikasi yang lebih kompleks.
