大家好,欢迎来到IT知识分享网。
一、java中的匿名类
java的观察者模式:
//观察者
public interface Observer{
public void update();
}
//被观察主体
public class Subject{
private Array<Observer> observers;
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAllObservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
IT知识分享网
主函数
IT知识分享网class Main{
public static void main(String[] args) {
Subject subject = new Subject();
subject.attach(new Observer(){
private int state = 0;//状态
public void update(){
state++;
System.out.println("当前状态为" + Integer.toString(state));
}
})
}
}
二、C++匿名类模仿实现
C++没有直接提供匿名类,但说到底,java匿名类主要解决问题如下:
1、保证依赖于接口提供方法的具体实现,从而保证解耦,使得添加的匿名类对同一接口能够有不同的行为。
2、提高可读性,因为添加的匿名类的方法实现就在附近,可以直接阅读,而无需跳到对应的类文件阅读。
3、保持简洁性,这是匿名性所带来的,因为没有命名一个具体的类占用命名空间,因此不会导致类的数目过多,而导致后期难以维护。
C++虽然没有匿名类,但是有匿名对象和匿名函数,可以实现类似的效果。
#include<vector>
#include<iostream>
#include<memory>
using namespace std;
//观察者
class Observer
{
public:
Observer(void (*doA)()) :doAction(doA) {
}
void (*doAction)();//函数指针
};
//被观察主体
class Subject
{
vector<Observer> observers;
public:
void attach(Observer observer)
{
observers.push_back(observer);
}
void notifyAllObservers()
{
for (auto it = observers.begin(); it != observers.end(); it++)
{
it->doAction();
}
}
};
int main()
{
Subject sj;
sj.attach(Observer([] {
static int state = 0; state++; cout << "匿名类1当前状态为"<<state<<endl; }));//匿名函数
sj.attach(Observer([] {
static int state = 2; state++; cout << "匿名类2当前状态为"<<state<<endl; }));
sj.notifyAllObservers();
}
这种方式虽然没有像java一样约定一个接口类,然后在用匿名类去实现接口方法,但也通过函数指针的方式,约定了函数名、函数的参数列表以及函数的返回值。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10920.html