观察者模式体验就是一个:
问题:在做UI设计时,遇到一个问题,就是当我点击一个自定义对话框的复选框时,自定义对话框的父界面必须做出相应的改变,还有,自定义对话框是做成的组件,应用于很多场合(有很多的界面用到此对话框);
//这是自定义的对话框,当事件是checkbox时,让父界面做//出改变
Public class DialogBox implements ClickListener {
Public void onClick(event e){
}
}
//这是父界面,他弹出对话框
Public class ParentFrame extends ParentClass{
Public void popDialogBox(){
DialogBox dialogbox = new DialogBox(this) ;
}
}
解决方案一:
我把父界面的父类改变成自定义的父类,让父界面继承自定义的父类:
Public class DialogBox implements ClickListener{
Private Ojbect object = null ;
Private CheckBox checkbox = new CheckBox() ;
Public DialogBox(Ojbect object){
this.object = object ;
}
Public void onClick(event e){
If(e == checkbox){
//当事件是checkbox时,强制转换成Custom调用//update方法
((Custom)object).update();
}
}
}
//这是自定义类,它继承了ParentClass,并抽象了个update方//法
Public abstact CustomClass extends ParentClass{
Public abstract void update() ;
}
Public class ParentFrame extends CustomClass {
Public void popDialogBox(){
DialogBox dialogbox = new DialogBox(this) ;
}
Public void update(){
//父界面的更新操作
}
}
这个解决方案确实解决的问题,当自定义对话框点击checkbox时,确实会使他的父界面发生改变,但他的缺点太大:必须继承CustomClass才能具备这样的功能,而且主要是因为他改变了继承关系,在ParentFrame和ParentClass之间加了一层,这样使耦合度加大了;而且每次都把自身的引用通过构造传过去(new DialogBox(this)),在dialogbox那边还要强行转换回来,确实不是什么好办法J
解决方案二:
//定义CustomListener接口
Public interface CustomListener (){
Public void update() ;
}
Public class DialogBox implements ClickListener{
Private Ojbect object = null ;
Private CheckBox checkbox = new CheckBox() ;
Public DialogBox(Ojbect object){
this.object = object ;
}
Public void onClick(event e){
If(e == checkbox){
//当事件是checkbox时,强制转换成Custom调用//update方法
((CustomListener)object).update();
}
}
}
//实现了CustomListener接口
Public class ParentFrame extends ParentClass implements CustomListener {
Public void popDialogBox(){
DialogBox dialogbox = new DialogBox(this) ;
}
Public void update(){
//父界面的更新操作
}
}
这个解决方案也是解决了问题,尤其对第一解决方案而言,这个已经不会打乱继承关系,但是还没有脱离第二个缺陷;
解决方案三:
//定义Listener接口
Public interface CustomListener(){
Public void update() ;
}
//定义event接口
Public interface CustomEvent(){
Public void addCustomListener(CustomListener listener) ;
Public void removeCustomListener(CustomListener listner) ;
Public void notify() ;
}
Public class DialogBox implements ClickListener, CustomEvent {
Private List listenerList = new ArrayList() ;
Private CheckBox checkbox = new CheckBox() ;
Public DialogBox(Ojbect object){
this.object = object ;
}
Public void onClick(event e){
If(e == checkbox){
notify() ;
}
}
//注册一个观察者
Public void addCustomListener(CustomListener listener) {
listenerList.add(listener) ;
}
//删除一个观察者
Public void removeCustomListener(CustomListener listner){
listenerList.remove(listener) ;
}
//调用所以注册的观察者
Public void notify() {
If(listenerList != null && !( listenerList.isEmpty)){
for(int I = 0 ; I < listenerList.size() ; I ++){
((CustomListener)listenerList.get(i)).update();
}
}
}
}
//实现了CustomListener接口
Public class ParentFrame extends ParentClass implements CustomListener {
Public void popDialogBox(){
DialogBox dialogbox = new DialogBox() ;
dialogbox. addCustomListener((CustomListener)this) ;
}
Public void update(){
//父界面的更新操作
}
}
第三中解决方案才是观察者模式是应用,这才是较为合理的方案;
观察者模式应用前提是:有一个对象出发事件时,其他对象也发生改变;是个一对多的关系
分享到:
相关推荐
svn客户端工具(小乌龟) TortoiseSVN-1.8.4.24972-x64-svn-1.8.5.msi 命令行工具 Slik-Subversion-1.8.5-x64.msi 环境变量配置 有问题的童鞋可以留言,大家共同学习!
TortoiseSVN-1.8.5.25224-x64-svn-1.8.8 中文语言包
在这款软件的1.8.3.24901-x64版本中,针对64位操作系统特别推出了简体中文语言包,极大地便利了中文用户群体,使得在使用过程中可以更加流畅地理解各项功能和操作。 首先,我们需要理解Subversion(SVN)的基本概念...
3. **冲突解决**:在多人协作的环境中,可能会出现同一文件的并发修改,TortoiseSVN提供了解决冲突的工具,帮助用户手动解决这些问题。 4. **提交和更新**:用户可以将本地的改动提交到远程仓库,也可以随时从仓库...
TortoiseSVN-1.8.11.26392-x64-svn-1.8.13
c3p0-0.9.5.2.jar mchange-commons-java-0.2.11.jar commons-logging-1.2.jar mysql-connector-java-5.1.43-bin.jar
gcc安装依赖包mpfr-2.4.2.tar.bz2、mpc-0.8.1.tar.gz、isl-0.14.tar.bz2、gmp-4.3.2.tar
这些教程通常包含了如何配置SVN服务器,如何初始化仓库,如何进行版本控制操作,以及解决常见问题的方法等内容,对初学者非常有帮助。 总之,TortoiseSVN-1.8.4.24972-win32-svn-1.8.5安装包提供了完整的32位...
TortoiseSVN-1.8.3.24901-x64-svn-1.8.4(SVN程序) LanguagePack_1.8.3.24901-x64-zh_CN(中文补丁) VisualSVN-3.5.3破解版(安装后替换两个dll) 完美支持: visaul studio 2005 visaul studio 2008 visaul studio ...
标题中的"ActivePerl-5.22.1.2201-MSWin32-x64-299574.msi"是ActivePerl的一个安装程序文件,适用于64位的Windows 10操作系统。ActivePerl是Perl编程语言的一个预编译版本,为Windows环境提供了方便的安装和使用体验...
RHEL 7.1安装MySQL 5.6的依赖包:perl-Data-Dumper-2.145-3.el7.x86_64.rpm ------------------------------------------------------------------------------------
版本号中的数字和点有特定含义,1.8代表主版本,3代表次版本,24901可能是内部修订号,用于区分同一次版本中的不同补丁或改进。这里的1.8.4指的是SVN库的版本,与TortoiseSVN客户端版本相匹配,确保了最佳兼容性。 ...
Windwos 64位系统下安装 dlib 19.19.0 的 wheel分发包。通过pip install dlib-19.19.0-cp38-cp38-win_amd64.whl 完成安装。
TortoiseSVN-1.7.6.22632-x64-svn-1.7.4
-rw-r--r--. 1 root root 4239360 Jun 25 16:54 openssh-9.0p1-1.el7.x86_64.rpm -rw-r--r--. 1 root root 654600 Jun 25 16:51 openssh-clients-9.0p1-1.el7.x86_64.rpm -rw-r--r--. 1 root root 3108976 Jun 25 16...
perl-DBD-MySQL-4.013-3.el6.x86_64.rpm perl-DBI-1.609-4.el6.x86_64.rpm perl-hivex-1.3.3-4.2.el6.x86_64.rpm polkit-0.96-5.el6_4.x86_64.rpm pyOpenSSL-0.13.1-1.el6.x86_64.rpm PyPAM-0.5.0-12.el6.x86_64.rpm...
jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)jquery-3.7.0.min.js(jQuery下载)...
audit-libs-2.8.5-4.el7.x86_64.rpm checkpolicy-2.5-8.el7.x86_64.rpm containerd.io-1.2.6-3.3.el7.x86_64.rpm container-selinux-2.107-1.el7_6.noarch.rpm docker-ce-19.03.9-3.el7.x86_64.rpm docker-ce-cli-...
epel-release-6-8.noarch.rpm epel-release-6-8.noarch.rpm
ARM Linux交叉编译工具链,arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2