abstract observer and observable