面向Holder编程

概述

在我们实际开发过程中,当我们软件的功能做得多的时候,这个时候我们的代码量也就越来越大了,如果我们不把代码进行封装,不仅让我们开发的时候变得困难,而且不利于维护,特别是团队开发的时候,如果我们一个Activity就几百行,当然几百行也算是少的了,甚至可能上千行。这个时候如果让你看几千行的代码,你是不是觉得好费劲呢,而且开发起来也变得困难了。

面向holder编程思想其实很简单,就是简单的把一个大的复杂的功能或者页面分成几个小的功能分别去实现,下面我们看一张图片来看看面向holder编程思想

这里写图片描述

这个是我从和阅读上面截的一张图,我们来分析一下要实现这样一个相对复杂的界面功能,我们可以怎么做。下面我们来对这个界面进行划分一下

这里写图片描述

如果你觉得这种界面功能不复杂的话,你就可以不划分,直接写在个布局里面,然后在一个Activity中完成相应的界面功能,当你的activity里面的代码就大了好多,你也可以有其他的划分方法。

当我们把上面的复杂界面划分好了之后我们可以在这个activity的布局文件里面只要写上4个FrameLayout或者RelativeLayout,然后在代码中实例化它们,之后开始每个小功能在holder里面写了

在holder里面我们可以这样写
import android.content.Context;
import android.view.View;

public class Holder {

    private View rootView;
    private Context ct;

    public Holder(Context ct) {
        this.ct = ct;
        init();
        initView();
        initData();
    }

    /**
     * 可以在这里完成一些初始化的操作,这些操作可以在布局没有实例好之前初始化
     */
    private void init() {

    }

    /**
     * 在这里面实例化布局相关的组件
     */
    private void initView() {

    }

    /**
     * 在这里可以为相应的组件添加事件,初始化状态,或者联网请求数据
     */
    private void initData() {

    }

    /**
     * 得到该holder维护的view
     * @return 该holder维护视图的根布局
     */
    public View getRootView() {
        return rootView;
    }
}



完成了上面的简单的holder模型之后,之后在initView和initData方法完成的操作就和在activity或者fragment中的操作相同了
在此之后我们只要在activity中创建该Holder,然后在activity中为之前写的FrameLayout或者RelativeLayout调用addView方法把从holder.getRootView()得到的view添加到里面即可,这个时候你不仅会发现Activity里面的代码变少了很多,而且你开发起来也会根据清晰,逻辑更加简单。

以后在开发中可以用到这种编程思想,把我们的代码尽可能的减少,把复杂的界面划分成几个小的模块,逐一实现,逻辑放在各自独立的holder里面,同时我们可以结合许多开源的框架来简化我们的开发。

总结一下,面向holder编程,实际上是对代码的再度封装,简化了我们开发的成本。

### C++ 面向对象编程 示例题目解析 以下是几个典型的 C++ 面向对象编程 (Object-Oriented Programming, OOP) 的示例题目及其解析: #### 示例一:学生管理系统 该系统可以用于管理学生的个人信息以及成绩记录。 ```cpp #include <iostream> #include <string> using namespace std; class Student { private: string name; int age; double score; public: // 构造函数 Student(string n = "", int a = 0, double s = 0.0) : name(n), age(a), score(s) {} // 设置姓名 void setName(const string& n) { name = n; } // 获取姓名 string getName() const { return name; } // 设置年龄 void setAge(int a) { age = a; } // 获取年龄 int getAge() const { return age; } // 设置分数 void setScore(double s) { score = s; } // 获取分数 double getScore() const { return score; } // 显示学生信息 void displayInfo() const { cout << "Name: " << name << ", Age: " << age << ", Score: " << score << endl; } }; int main() { Student student1("Alice", 20, 85.5); student1.displayInfo(); Student student2("Bob"); student2.setAge(22); student2.setScore(90.0); student2.displayInfo(); } ``` 上述代码展示了如何定义一个 `Student` 类并实现其基本功能[^4]。通过封装,隐藏了内部的数据成员 (`name`, `age`, `score`) 并提供了公共接口来访问这些数据。 --- #### 示例二:图形库设计 此例子展示了一个简单的图形库,支持多种形状的绘制和面积计算。 ```cpp #include <iostream> #include <cmath> using namespace std; // 基类 Shape class Shape { protected: string color; public: Shape(const string& c = "black") : color(c) {} virtual ~Shape() {} // 虚析构函数 virtual double area() const = 0; // 纯虚函数 virtual void draw() const = 0; // 纯虚函数 string getColor() const { return color; } }; // 派生类 Circle class Circle : public Shape { private: double radius; public: Circle(double r, const string& c = "red") : Shape(c), radius(r) {} double area() const override { return M_PI * pow(radius, 2); } void draw() const override { cout << "Drawing a circle with color " << color << "." << endl; } }; // 派生类 Rectangle class Rectangle : public Shape { private: double width, height; public: Rectangle(double w, double h, const string& c = "blue") : Shape(c), width(w), height(h) {} double area() const override { return width * height; } void draw() const override { cout << "Drawing a rectangle with color " << color << "." << endl; } }; int main() { Circle circle(5.0, "green"); cout << "Circle Area: " << circle.area() << endl; circle.draw(); Rectangle rect(4.0, 6.0, "yellow"); cout << "Rectangle Area: " << rect.area() << endl; rect.draw(); } ``` 这段代码演示了继承、多态的概念。基类 `Shape` 提供通用的功能,而派生类 `Circle` 和 `Rectangle` 则实现了具体的逻辑。 --- #### 示例三:银行账户模拟 这是一个简单但实用的例子,用来说明类的设计原则。 ```cpp #include <iostream> #include <iomanip> // 控制浮点数精度 using namespace std; class BankAccount { private: string accountHolder; double balance; public: BankAccount(const string& holder, double initialBalance = 0.0) : accountHolder(holder), balance(initialBalance) {} bool deposit(double amount) { if (amount > 0) { balance += amount; return true; } else { cerr << "Invalid deposit amount." << endl; return false; } } bool withdraw(double amount) { if (amount > 0 && amount <= balance) { balance -= amount; return true; } else { cerr << "Insufficient funds or invalid withdrawal amount." << endl; return false; } } double getBalance() const { return balance; } void showDetails() const { cout << fixed << setprecision(2); cout << "Account Holder: " << accountHolder << "\nBalance: $" << balance << endl; } }; int main() { BankAccount acc("John Doe", 1000.0); acc.showDetails(); acc.deposit(500.0); acc.withdraw(200.0); acc.showDetails(); } ``` 这个例子强调了封装的重要性——外部无法直接修改账户余额,而是通过受控的方法完成操作。 --- ### 结论 以上三个示例分别涵盖了面向对象编程的核心概念:封装、继承和多态。它们不仅帮助理解理论基础,还提供实践指导[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值