domanda, in una applicazione strutturata ad oggetti, come avviene la separazione in livelli del software?

interfaccia
----------
logica di business
----------
database


io di solito uso questo sistema:

supponiamo di avere una classe contatto

Codice PHP:
<?
class Contatto(){

    var 
$db;
    var 
$gestore;
    var 
$tabella_db;

    function 
Contatto($db){
        
$this->db=$db;
        
$this->gestore="manage_contatti.php";
        
$this->tabella_db="contatti";
    }

    function 
Menu{
    
?>
    [*][url="<?echo $this->gestore?>"]Aggiungi[/url]
    <?
    
}

    function 
Add(){
    
?>
    <form action="<?echo $this->gestore?>" method="post">
    

nome:<input name="nome" type="text"></p>
    

cognome:<input name="nome" type="text"></p>
    <input type="hidden" name="operazione" value="add">
    

<input value="salva" type="submit"></p>
    </form>
    <?
    
}

    function 
Add_db($nome,$cognome){
        
$query="insert into $this->tabella_db (nome,cognome) values ('$nome','$cognome')";
        
$db->do_query($query);
    }
}
?>
che è gestita dal file manage_contatto.php
Codice PHP:
<?
include "contatto.php";
include 
"database.php";

$db=new Database("host","user","password","database");

$contatto=new Contatto($db);

$contatto->Menu();

switch(
$_GET["operazione"]){

case 
"add":$contatto->Add();break;
default:;
}

if(
$_GET["operazione"]=="add"){

    
$nome    =$_POST["nome"];
    
$cognome    =$_POST["cognome"];

    
$controlli=true;

    if(
strlen($nome)<=0){
        
errore("nome obbligatorio");
        
$controlli=false;
    }

    if(
strlen($cognome)<=0){
        
errore("cognome obbligatorio");
        
$controlli=false;
    }

    if(
$controlli){
        
$contatto->Add_db($nome,$cognome);
    }
}
?>

vi sembra che sia valido come sistema per separare la logica di business dal codice?

come si potrebbe fare per separare ulteriormente la struttura, tenendo da parte la grafica?
in pratica, dove potrei spostare il metodo Add() ?

in pratica il file manage_contatti.php si occupa di fare tutti i controlli e di chiamare i vari metodi a seconda dei parametri get o post che riceve

PS: date per scontato alcune funzioni e la classe database che non ho riportato...